/** * 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.dynamic.data.mapping.data.provider.internal; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProvider; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderContext; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderContextContributor; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderInvoker; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderRequest; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderResponse; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderResponse.Status; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderTracker; import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONDeserializer; import com.liferay.dynamic.data.mapping.model.DDMDataProviderInstance; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.service.DDMDataProviderInstanceService; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.util.DDMFormFactory; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.security.auth.PrincipalException; import com.liferay.portal.kernel.util.Validator; import java.util.List; import java.util.Map; import java.util.Optional; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Marcellus Tavares */ @Component(immediate = true) public class DDMDataProviderInvokerImpl implements DDMDataProviderInvoker { public DDMDataProviderResponse invoke( DDMDataProviderRequest ddmDataProviderRequest) { try { String ddmDataProviderInstanceId = ddmDataProviderRequest.getDDMDataProviderInstanceId(); Optional<DDMDataProviderInstance> ddmDataProviderInstanceOptional = fetchDDMDataProviderInstance(ddmDataProviderInstanceId); setDDMDataProviderRequestAttributes( ddmDataProviderRequest, ddmDataProviderInstanceOptional); DDMDataProvider ddmDataProvider = getDDMDataProvider( ddmDataProviderInstanceId, ddmDataProviderInstanceOptional); return ddmDataProvider.getData(ddmDataProviderRequest); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to invoke DDM Data Provider instance ID " + ddmDataProviderRequest.getDDMDataProviderInstanceId(), e); } if (e instanceof PrincipalException) { return DDMDataProviderResponse.error(Status.UNAUTHORIZED); } } return DDMDataProviderResponse.error(Status.INTERNAL_SERVER_ERROR); } protected void addDDMDataProviderRequestParameters( DDMDataProviderRequest ddmDataProviderRequest, DDMDataProviderInstance ddmDataProviderInstance) { // Context Contributors List<DDMDataProviderContextContributor> ddmDataProviderContextContributors = ddmDataProviderTracker.getDDMDataProviderContextContributors( ddmDataProviderInstance.getType()); for (DDMDataProviderContextContributor ddmDataProviderContextContributor : ddmDataProviderContextContributors) { Map<String, String> parameters = ddmDataProviderContextContributor.getParameters( ddmDataProviderRequest.getHttpServletRequest()); if (parameters == null) { continue; } ddmDataProviderRequest.queryString(parameters); } } protected DDMDataProviderContext createDDMDataProviderContext( DDMDataProviderInstance ddmDataProviderInstance) { try { DDMDataProvider ddmDataProvider = ddmDataProviderTracker.getDDMDataProvider( ddmDataProviderInstance.getType()); DDMForm ddmForm = DDMFormFactory.create( ddmDataProvider.getSettings()); DDMFormValues ddmFormValues = ddmFormValuesJSONDeserializer.deserialize( ddmForm, ddmDataProviderInstance.getDefinition()); return new DDMDataProviderContext(ddmFormValues); } catch (PortalException pe) { throw new IllegalStateException(pe); } } protected Optional<DDMDataProviderInstance> fetchDDMDataProviderInstance( String ddmDataProviderInstanceId) throws PortalException { DDMDataProviderInstance ddmDataProviderInstance = ddmDataProviderInstanceService.fetchDataProviderInstanceByUuid( ddmDataProviderInstanceId); if ((ddmDataProviderInstance == null) && Validator.isNumber(ddmDataProviderInstanceId)) { ddmDataProviderInstance = ddmDataProviderInstanceService.fetchDataProviderInstance( Long.valueOf(ddmDataProviderInstanceId)); } return Optional.ofNullable(ddmDataProviderInstance); } protected DDMDataProvider getDDMDataProvider( String ddmDataProviderInstanceId, Optional<DDMDataProviderInstance> ddmDataProviderInstanceOptional) { Optional<DDMDataProvider> ddmDataProviderTypeOptional = ddmDataProviderInstanceOptional.map( ddmDataProviderInstance -> ddmDataProviderTracker.getDDMDataProvider( ddmDataProviderInstance.getType())); return ddmDataProviderTypeOptional.orElseGet( () -> ddmDataProviderTracker.getDDMDataProviderByInstanceId( ddmDataProviderInstanceId)); } protected void setDDMDataProviderRequestAttributes( DDMDataProviderRequest ddmDataProviderRequest, Optional<DDMDataProviderInstance> ddmDataProviderInstanceOptional) { ddmDataProviderInstanceOptional.ifPresent( ddmDataProviderInstance -> { addDDMDataProviderRequestParameters( ddmDataProviderRequest, ddmDataProviderInstance); setDDMDataProviderRequestContext( ddmDataProviderRequest, ddmDataProviderInstance); }); } protected void setDDMDataProviderRequestContext( DDMDataProviderRequest ddmDataProviderRequest, DDMDataProviderInstance ddmDataProviderInstance) { DDMDataProviderContext ddmDataProviderContext = createDDMDataProviderContext(ddmDataProviderInstance); ddmDataProviderRequest.setDDMDataProviderContext( ddmDataProviderContext); // Backwards compatibility ddmDataProviderContext.addParameters( ddmDataProviderRequest.getParameters()); } @Reference protected DDMDataProviderInstanceService ddmDataProviderInstanceService; @Reference protected DDMDataProviderTracker ddmDataProviderTracker; @Reference protected DDMFormValuesJSONDeserializer ddmFormValuesJSONDeserializer; private static final Log _log = LogFactoryUtil.getLog( DDMDataProviderInvokerImpl.class); }