All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.batch.engine.internal.unit.BatchEngineUnitReaderImpl Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.batch.engine.internal.unit;

import com.liferay.batch.engine.BatchEngineTaskContentType;
import com.liferay.batch.engine.internal.bundle.AdvancedBundleBatchEngineUnitImpl;
import com.liferay.batch.engine.internal.bundle.ClassicBundleBatchEngineUnitImpl;
import com.liferay.batch.engine.unit.BatchEngineUnit;
import com.liferay.batch.engine.unit.BatchEngineUnitConfiguration;
import com.liferay.batch.engine.unit.BatchEngineUnitMetaInfo;
import com.liferay.batch.engine.unit.BatchEngineUnitReader;
import com.liferay.petra.io.Deserializer;
import com.liferay.petra.io.Serializer;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.NaturalOrderStringComparator;
import com.liferay.portal.kernel.util.StringUtil;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;

import java.net.URL;

import java.nio.ByteBuffer;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.osgi.framework.Bundle;
import org.osgi.service.component.annotations.Component;

/**
 * @author Alejandro Tardín
 */
@Component(service = BatchEngineUnitReader.class)
public class BatchEngineUnitReaderImpl implements BatchEngineUnitReader {

	@Override
	public Collection getBatchEngineUnits(Bundle bundle) {
		Dictionary headers = bundle.getHeaders(
			StringPool.BLANK);

		String batchPath = headers.get("Liferay-Client-Extension-Batch");

		if (batchPath != null) {
			if (batchPath.isEmpty()) {
				batchPath = StringPool.PERIOD;
			}

			if (StringUtil.startsWith(batchPath, StringPool.SLASH)) {
				batchPath = batchPath.substring(1);
			}

			if (!StringUtil.endsWith(batchPath, StringPool.SLASH)) {
				batchPath = batchPath.concat(StringPool.SLASH);
			}

			return _getBatchEngineBundleUnitsCollection(bundle, batchPath);
		}

		return Collections.emptyList();
	}

	private String _getBatchEngineBundleEntryKey(URL url) {
		String zipEntryName = url.getPath();

		if (_isBatchEngineTechnical(zipEntryName)) {
			return zipEntryName;
		}

		if (!zipEntryName.contains(StringPool.SLASH)) {
			return StringPool.SLASH;
		}

		return zipEntryName.substring(
			0, zipEntryName.lastIndexOf(StringPool.SLASH) + 1);
	}

	private Collection _getBatchEngineBundleUnitsCollection(
		Bundle bundle, String batchPath) {

		List batchEngineUnits = _loadBatchEngineUnits(bundle);

		if (batchEngineUnits != null) {
			return batchEngineUnits;
		}

		batchEngineUnits = new ArrayList<>();

		Map> bundleBatchEngineUnitURLs = new TreeMap<>(
			new NaturalOrderStringComparator());

		Enumeration enumeration = bundle.findEntries(batchPath, "*", true);

		while (enumeration.hasMoreElements()) {
			URL url = enumeration.nextElement();

			if (StringUtil.endsWith(url.getPath(), StringPool.SLASH)) {
				continue;
			}

			bundleBatchEngineUnitURLs.compute(
				_getBatchEngineBundleEntryKey(url),
				(k, urls) -> {
					if (urls == null) {
						urls = new ArrayList<>();
					}

					urls.add(url);

					return urls;
				});
		}

		for (Map.Entry> entry :
				bundleBatchEngineUnitURLs.entrySet()) {

			List urls = entry.getValue();

			if (_isBatchEngineTechnical(entry.getKey())) {
				URL url = urls.get(0);

				AdvancedBundleBatchEngineUnitImpl
					advancedBundleBatchEngineUnitImpl =
						new AdvancedBundleBatchEngineUnitImpl(bundle, url);

				if (advancedBundleBatchEngineUnitImpl.isValid()) {
					advancedBundleBatchEngineUnitImpl.
						setBatchEngineUnitMetaInfo(
							_toBatchEngineUnitMetaInfo(
								advancedBundleBatchEngineUnitImpl,
								Arrays.asList(url)));

					batchEngineUnits.add(advancedBundleBatchEngineUnitImpl);
				}
			}
			else {
				ClassicBundleBatchEngineUnitImpl
					classicBundleBatchEngineUnitImpl =
						new ClassicBundleBatchEngineUnitImpl(bundle, urls);

				if (classicBundleBatchEngineUnitImpl.isValid()) {
					classicBundleBatchEngineUnitImpl.setBatchEngineUnitMetaInfo(
						_toBatchEngineUnitMetaInfo(
							classicBundleBatchEngineUnitImpl, urls));

					batchEngineUnits.add(classicBundleBatchEngineUnitImpl);
				}
			}
		}

		_saveBatchEngineUnits(bundle, batchEngineUnits);

		return batchEngineUnits;
	}

	private String _getFeatureFlagKey(
		BatchEngineUnitConfiguration batchEngineUnitConfiguration) {

		Map parameters =
			batchEngineUnitConfiguration.getParameters();

		if (parameters == null) {
			return StringPool.BLANK;
		}

		return GetterUtil.getString(parameters.get("featureFlag"));
	}

	private boolean _isBatchEngineTechnical(String zipEntryName) {
		if (zipEntryName.endsWith(
				BatchEngineTaskContentType.JSONT.getFileExtension())) {

			return true;
		}

		return false;
	}

	private List _loadBatchEngineUnits(Bundle bundle) {
		File file = bundle.getDataFile("batchEngineUnits.data");

		if (!file.exists()) {
			return null;
		}

		try {
			Deserializer deserializer = new Deserializer(
				ByteBuffer.wrap(FileUtil.getBytes(file)));

			if (deserializer.readLong() == bundle.getLastModified()) {
				List batchEngineUnits = new ArrayList<>();

				int size = deserializer.readInt();

				for (int i = 0; i < size; i++) {
					BatchEngineUnitMetaInfo batchEngineUnitMetaInfo =
						BatchEngineUnitMetaInfo.readFrom(deserializer);

					batchEngineUnits.add(
						_toBatchEngineUnit(bundle, batchEngineUnitMetaInfo));
				}

				return batchEngineUnits;
			}
		}
		catch (IOException ioException) {
			_log.error("Unable to read batch engine units", ioException);
		}

		return null;
	}

	private void _saveBatchEngineUnits(
		Bundle bundle, List batchEngineUnits) {

		Serializer serializer = new Serializer();

		serializer.writeLong(bundle.getLastModified());
		serializer.writeInt(batchEngineUnits.size());

		try (OutputStream outputStream = new FileOutputStream(
				bundle.getDataFile("batchEngineUnits.data"))) {

			for (BatchEngineUnit batchEngineUnit : batchEngineUnits) {
				BatchEngineUnitMetaInfo batchEngineUnitMetaInfo =
					batchEngineUnit.getBatchEngineUnitMetaInfo();

				batchEngineUnitMetaInfo.writeTo(serializer);
			}

			serializer.writeTo(outputStream);
		}
		catch (IOException ioException) {
			_log.error("Unable to write batch engine units", ioException);
		}
	}

	private BatchEngineUnit _toBatchEngineUnit(
		Bundle bundle, BatchEngineUnitMetaInfo batchEngineUnitMetaInfo) {

		String[] paths = batchEngineUnitMetaInfo.getPaths();

		if (batchEngineUnitMetaInfo.isAdvanced()) {
			AdvancedBundleBatchEngineUnitImpl
				advancedBundleBatchEngineUnitImpl =
					new AdvancedBundleBatchEngineUnitImpl(
						bundle, bundle.getEntry(paths[0]));

			advancedBundleBatchEngineUnitImpl.setBatchEngineUnitMetaInfo(
				batchEngineUnitMetaInfo);

			return advancedBundleBatchEngineUnitImpl;
		}

		List urls = new ArrayList<>();

		for (String path : paths) {
			urls.add(bundle.getEntry(path));
		}

		ClassicBundleBatchEngineUnitImpl classicBundleBatchEngineUnitImpl =
			new ClassicBundleBatchEngineUnitImpl(bundle, urls);

		classicBundleBatchEngineUnitImpl.setBatchEngineUnitMetaInfo(
			batchEngineUnitMetaInfo);

		return classicBundleBatchEngineUnitImpl;
	}

	private BatchEngineUnitMetaInfo _toBatchEngineUnitMetaInfo(
		BatchEngineUnit batchEngineUnit, List urls) {

		try {
			BatchEngineUnitConfiguration batchEngineUnitConfiguration =
				batchEngineUnit.getBatchEngineUnitConfiguration();

			String[] paths = new String[urls.size()];

			for (int i = 0; i < urls.size(); i++) {
				URL url = urls.get(i);

				paths[i] = url.getPath();
			}

			return new BatchEngineUnitMetaInfo(
				batchEngineUnit instanceof AdvancedBundleBatchEngineUnitImpl,
				batchEngineUnitConfiguration.getCompanyId(),
				_getFeatureFlagKey(batchEngineUnitConfiguration),
				batchEngineUnitConfiguration.isMultiCompany(), paths);
		}
		catch (IOException ioException) {
			_log.error(
				"Unable to parse batch engine unit configuration", ioException);

			return null;
		}
	}

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

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy