protected void collectSupportedPublishingEvents(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Set<QName> publishingEvents = new HashSet<>();

    PortletApp portletApp = portletModel.getPortletApp();

    List<String> supportedPublishingEvents =
        StringPlus.asList(serviceReference.getProperty("javax.portlet.supported-publishing-event"));

    for (String supportedPublishingEvent : supportedPublishingEvents) {
      String name = supportedPublishingEvent;
      String qname = null;

      String[] parts = StringUtil.split(supportedPublishingEvent, StringPool.SEMICOLON);

      if (parts.length == 2) {
        name = parts[0];
        qname = parts[1];
      }

      QName qName = getQName(name, qname, portletApp.getDefaultNamespace());

      publishingEvents.add(qName);
    }

    portletModel.setPublishingEvents(publishingEvents);
  }
  protected void collectPortletModes(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Map<String, Set<String>> portletModes = new HashMap<>();

    portletModes.put(
        ContentTypes.TEXT_HTML, SetUtil.fromArray(new String[] {toLowerCase(PortletMode.VIEW)}));

    List<String> portletModesStrings =
        StringPlus.asList(serviceReference.getProperty("javax.portlet.portlet-mode"));

    for (String portletModesString : portletModesStrings) {
      String[] portletModesStringParts = StringUtil.split(portletModesString, CharPool.SEMICOLON);

      if (portletModesStringParts.length != 2) {
        continue;
      }

      String mimeType = portletModesStringParts[0];

      Set<String> mimeTypePortletModes = new HashSet<>();

      mimeTypePortletModes.add(toLowerCase(PortletMode.VIEW));
      mimeTypePortletModes.addAll(toLowerCaseSet(portletModesStringParts[1]));

      portletModes.put(mimeType, mimeTypePortletModes);
    }

    portletModel.setPortletModes(portletModes);
  }
  protected void collectSupportedPublicRenderParameters(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Set<PublicRenderParameter> publicRenderParameters = new HashSet<>();

    PortletApp portletApp = portletModel.getPortletApp();

    List<String> supportedPublicRenderParameters =
        StringPlus.asList(
            serviceReference.getProperty("javax.portlet.supported-public-render-parameter"));

    for (String supportedPublicRenderParameter : supportedPublicRenderParameters) {

      String name = supportedPublicRenderParameter;
      String qname = null;

      String[] parts = StringUtil.split(supportedPublicRenderParameter, StringPool.SEMICOLON);

      if (parts.length == 2) {
        name = parts[0];
        qname = parts[1];
      }

      QName qName = getQName(name, qname, portletApp.getDefaultNamespace());

      PublicRenderParameter publicRenderParameter =
          new PublicRenderParameterImpl(name, qName, portletApp);

      publicRenderParameters.add(publicRenderParameter);
    }

    portletModel.setPublicRenderParameters(publicRenderParameters);
  }
  protected void collectSecurityRoleRefs(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Set<String> unlinkedRoles = new HashSet<>();

    List<String> roleRefs =
        StringPlus.asList(serviceReference.getProperty("javax.portlet.security-role-ref"));

    if (roleRefs.isEmpty()) {
      roleRefs.add("administrator");
      roleRefs.add("guest");
      roleRefs.add("power-user");
      roleRefs.add("user");
    }

    for (String roleRef : roleRefs) {
      for (String curRoleRef : StringUtil.split(roleRef)) {
        unlinkedRoles.add(curRoleRef);
      }
    }

    portletModel.setUnlinkedRoles(unlinkedRoles);

    portletModel.linkRoles();
  }
  protected void collectApplicationTypes(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Set<ApplicationType> applicationTypes = new HashSet<>();

    List<String> applicationTypeValues =
        StringPlus.asList(get(serviceReference, "application-type"));

    for (String applicationTypeValue : applicationTypeValues) {
      try {
        ApplicationType applicationType = ApplicationType.parse(applicationTypeValue);

        applicationTypes.add(applicationType);
      } catch (IllegalArgumentException iae) {
        _log.error("Application type " + applicationTypeValue);

        continue;
      }
    }

    if (applicationTypes.isEmpty()) {
      applicationTypes.add(ApplicationType.WIDGET);
    }

    portletModel.setApplicationTypes(applicationTypes);
  }
    @Override
    public IndexerPostProcessor addingService(
        ServiceReference<IndexerPostProcessor> serviceReference) {

      Registry registry = RegistryUtil.getRegistry();

      IndexerPostProcessor indexerPostProcessor = registry.getService(serviceReference);

      List<String> indexerClassNames =
          StringPlus.asList(serviceReference.getProperty("indexer.class.name"));

      for (String indexerClassName : indexerClassNames) {
        Indexer indexer = IndexerRegistryUtil.getIndexer(indexerClassName);

        if (indexer == null) {
          _log.error("No indexer for " + indexerClassName + " was found");

          continue;
        }

        indexer.registerIndexerPostProcessor(indexerPostProcessor);
      }

      return indexerPostProcessor;
    }
  @Reference(unbind = "-")
  protected void setHttpServiceRuntime(
      HttpServiceRuntime httpServiceRuntime, Map<String, Object> properties) {

    List<String> httpServiceEndpoints =
        StringPlus.asList(properties.get(HttpServiceRuntimeConstants.HTTP_SERVICE_ENDPOINT));

    if (!httpServiceEndpoints.isEmpty()) {
      _httpServiceEndpoint = httpServiceEndpoints.get(0);
    }
  }
    @Override
    public Object addingService(ServiceReference<Object> serviceReference) {
      List<String> authTokenIgnoreActions =
          StringPlus.asList(serviceReference.getProperty(PropsKeys.AUTH_TOKEN_IGNORE_ACTIONS));

      _portletCSRFWhitelistActions.addAll(authTokenIgnoreActions);

      Registry registry = RegistryUtil.getRegistry();

      return registry.getService(serviceReference);
    }
  protected void collectWindowStates(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Map<String, Set<String>> windowStates = new HashMap<>();

    windowStates.put(
        ContentTypes.TEXT_HTML,
        SetUtil.fromArray(
            new String[] {
              toLowerCase(LiferayWindowState.EXCLUSIVE),
              toLowerCase(LiferayWindowState.POP_UP),
              toLowerCase(WindowState.MAXIMIZED),
              toLowerCase(WindowState.MINIMIZED),
              toLowerCase(WindowState.NORMAL)
            }));

    List<String> windowStatesStrings =
        StringPlus.asList(serviceReference.getProperty("javax.portlet.window-state"));

    for (String windowStatesString : windowStatesStrings) {
      String[] windowStatesStringParts = StringUtil.split(windowStatesString, CharPool.SEMICOLON);

      if (windowStatesStringParts.length != 2) {
        continue;
      }

      String mimeType = windowStatesStringParts[0];

      Set<String> mimeTypeWindowStates = new HashSet<>();

      mimeTypeWindowStates.add(toLowerCase(WindowState.NORMAL));

      Set<String> windowStatesSet = toLowerCaseSet(windowStatesStringParts[1]);

      if (windowStatesSet.isEmpty()) {
        mimeTypeWindowStates.add(toLowerCase(LiferayWindowState.EXCLUSIVE));
        mimeTypeWindowStates.add(toLowerCase(LiferayWindowState.POP_UP));
        mimeTypeWindowStates.add(toLowerCase(WindowState.MAXIMIZED));
        mimeTypeWindowStates.add(toLowerCase(WindowState.MINIMIZED));
      } else {
        mimeTypeWindowStates.addAll(windowStatesSet);
      }

      windowStates.put(mimeType, mimeTypeWindowStates);
    }

    portletModel.setWindowStates(windowStates);
  }
  protected void collectSupportedProcessingEvents(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    Set<QName> processingEvents = new HashSet<>();

    PortletApp portletApp = portletModel.getPortletApp();

    List<String> supportedProcessingEvents =
        StringPlus.asList(serviceReference.getProperty("javax.portlet.supported-processing-event"));

    for (String supportedProcessingEvent : supportedProcessingEvents) {
      String name = supportedProcessingEvent;
      String qname = null;

      String[] parts = StringUtil.split(supportedProcessingEvent, StringPool.SEMICOLON);

      if (parts.length == 2) {
        name = parts[0];
        qname = parts[1];
      }

      QName qName = getQName(name, qname, portletApp.getDefaultNamespace());

      processingEvents.add(qName);

      Set<EventDefinition> eventDefinitions = portletApp.getEventDefinitions();

      for (EventDefinition eventDefinition : eventDefinitions) {
        Set<QName> qNames = eventDefinition.getQNames();

        if (qNames.contains(qName)) {
          processingEvents.addAll(qNames);
        }
      }
    }

    portletModel.setProcessingEvents(processingEvents);
  }
  protected void collectLiferayFeatures(
      ServiceReference<Portlet> serviceReference, com.liferay.portal.model.Portlet portletModel) {

    portletModel.setActionTimeout(
        GetterUtil.getInteger(
            get(serviceReference, "action-timeout"), portletModel.getActionTimeout()));
    portletModel.setActionURLRedirect(
        GetterUtil.getBoolean(
            get(serviceReference, "action-url-redirect"), portletModel.getActionURLRedirect()));
    portletModel.setActive(
        GetterUtil.getBoolean(get(serviceReference, "active"), portletModel.isActive()));
    portletModel.setAddDefaultResource(
        GetterUtil.getBoolean(
            get(serviceReference, "add-default-resource"), portletModel.isAddDefaultResource()));
    portletModel.setAjaxable(
        GetterUtil.getBoolean(get(serviceReference, "ajaxable"), portletModel.isAjaxable()));

    Set<String> autopropagatedParameters =
        SetUtil.fromCollection(
            StringPlus.asList(get(serviceReference, "autopropagated-parameters")));

    portletModel.setAutopropagatedParameters(autopropagatedParameters);

    portletModel.setControlPanelEntryWeight(
        GetterUtil.getDouble(
            get(serviceReference, "control-panel-entry-weight"),
            portletModel.getControlPanelEntryWeight()));
    portletModel.setCssClassWrapper(
        GetterUtil.getString(
            get(serviceReference, "css-class-wrapper"), portletModel.getCssClassWrapper()));
    portletModel.setFacebookIntegration(
        GetterUtil.getString(
            get(serviceReference, "facebook-integration"), portletModel.getFacebookIntegration()));
    portletModel.setFooterPortalCss(StringPlus.asList(get(serviceReference, "footer-portal-css")));
    portletModel.setFooterPortalJavaScript(
        StringPlus.asList(get(serviceReference, "footer-portal-javascript")));
    portletModel.setFooterPortletCss(
        StringPlus.asList(get(serviceReference, "footer-portlet-css")));
    portletModel.setFooterPortletJavaScript(
        StringPlus.asList(get(serviceReference, "footer-portlet-javascript")));
    portletModel.setFriendlyURLMapping(
        GetterUtil.getString(
            get(serviceReference, "friendly-url-mapping"), portletModel.getFriendlyURLMapping()));
    portletModel.setFriendlyURLRoutes(
        GetterUtil.getString(
            get(serviceReference, "friendly-url-routes"), portletModel.getFriendlyURLRoutes()));
    portletModel.setHeaderPortalCss(StringPlus.asList(get(serviceReference, "header-portal-css")));
    portletModel.setHeaderPortalJavaScript(
        StringPlus.asList(get(serviceReference, "header-portal-javascript")));
    portletModel.setHeaderPortletCss(
        StringPlus.asList(get(serviceReference, "header-portlet-css")));
    portletModel.setHeaderPortletJavaScript(
        StringPlus.asList(get(serviceReference, "header-portlet-javascript")));
    portletModel.setIcon(
        GetterUtil.getString(get(serviceReference, "icon"), portletModel.getIcon()));
    portletModel.setInclude(
        GetterUtil.getBoolean(get(serviceReference, "include"), portletModel.isInclude()));
    portletModel.setInstanceable(
        GetterUtil.getBoolean(
            get(serviceReference, "instanceable"), portletModel.isInstanceable()));
    portletModel.setLayoutCacheable(
        GetterUtil.getBoolean(
            get(serviceReference, "layout-cacheable"), portletModel.isLayoutCacheable()));
    portletModel.setMaximizeEdit(
        GetterUtil.getBoolean(
            get(serviceReference, "maximize-edit"), portletModel.isMaximizeEdit()));
    portletModel.setMaximizeHelp(
        GetterUtil.getBoolean(
            get(serviceReference, "maximize-help"), portletModel.isMaximizeHelp()));
    portletModel.setParentStrutsPath(
        GetterUtil.getString(
            get(serviceReference, "parent-struts-path"), portletModel.getParentStrutsPath()));
    portletModel.setPopUpPrint(
        GetterUtil.getBoolean(get(serviceReference, "pop-up-print"), portletModel.isPopUpPrint()));
    portletModel.setPreferencesCompanyWide(
        GetterUtil.getBoolean(
            get(serviceReference, "preferences-company-wide"),
            portletModel.isPreferencesCompanyWide()));
    portletModel.setPreferencesOwnedByGroup(
        GetterUtil.getBoolean(
            get(serviceReference, "preferences-owned-by-group"),
            portletModel.isPreferencesOwnedByGroup()));
    portletModel.setPreferencesUniquePerLayout(
        GetterUtil.getBoolean(
            get(serviceReference, "preferences-unique-per-layout"),
            portletModel.isPreferencesUniquePerLayout()));
    portletModel.setPrivateRequestAttributes(
        GetterUtil.getBoolean(
            get(serviceReference, "private-request-attributes"),
            portletModel.isPrivateRequestAttributes()));
    portletModel.setPrivateSessionAttributes(
        GetterUtil.getBoolean(
            get(serviceReference, "private-session-attributes"),
            portletModel.isPrivateSessionAttributes()));
    portletModel.setRemoteable(
        GetterUtil.getBoolean(get(serviceReference, "remoteable"), portletModel.isRemoteable()));
    portletModel.setRenderTimeout(
        GetterUtil.getInteger(
            get(serviceReference, "render-timeout"), portletModel.getRenderTimeout()));
    portletModel.setRenderWeight(
        GetterUtil.getInteger(
            get(serviceReference, "render-weight"), portletModel.getRenderWeight()));

    if (!portletModel.isAjaxable() && (portletModel.getRenderWeight() < 1)) {

      portletModel.setRenderWeight(1);
    }

    boolean defaultRequiresNamespacedParameters =
        GetterUtil.getBoolean(
            get(serviceReference, "requires-namespaced-parameters"),
            portletModel.isRequiresNamespacedParameters());

    portletModel.setRequiresNamespacedParameters(
        GetterUtil.getBoolean(
            serviceReference.getProperty("requires-namespaced-parameters"),
            defaultRequiresNamespacedParameters));

    portletModel.setRestoreCurrentView(
        GetterUtil.getBoolean(
            get(serviceReference, "restore-current-view"), portletModel.isRestoreCurrentView()));
    portletModel.setScopeable(
        GetterUtil.getBoolean(get(serviceReference, "scopeable"), portletModel.isScopeable()));
    portletModel.setShowPortletAccessDenied(
        GetterUtil.getBoolean(
            get(serviceReference, "show-portlet-access-denied"),
            portletModel.isShowPortletAccessDenied()));
    portletModel.setShowPortletInactive(
        GetterUtil.getBoolean(
            get(serviceReference, "show-portlet-inactive"), portletModel.isShowPortletInactive()));
    portletModel.setSocialInteractionsConfiguration(
        GetterUtil.getBoolean(
            get(serviceReference, "social-interactions-configuration"),
            portletModel.isSocialInteractionsConfiguration()));
    portletModel.setStrutsPath(
        GetterUtil.getString(get(serviceReference, "struts-path"), portletModel.getStrutsPath()));
    portletModel.setSystem(
        GetterUtil.getBoolean(get(serviceReference, "system"), portletModel.isSystem()));
    portletModel.setUseDefaultTemplate(
        GetterUtil.getBoolean(
            get(serviceReference, "use-default-template"), portletModel.isUseDefaultTemplate()));
    portletModel.setUserPrincipalStrategy(
        GetterUtil.getString(
            get(serviceReference, "user-principal-strategy"),
            portletModel.getUserPrincipalStrategy()));
    portletModel.setVirtualPath(
        GetterUtil.getString(get(serviceReference, "virtual-path"), portletModel.getVirtualPath()));
  }