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

io.vertigo.dynamo.export.model.ExportSheetBuilder Maven / Gradle / Ivy

There is a newer version: 0.9.4
Show newest version
/**
 * vertigo - simple java starter
 *
 * Copyright (C) 2013, KleeGroup, [email protected] (http://www.kleegroup.com)
 * KleeGroup, Centre d'affaire la Boursidiere - BP 159 - 92357 Le Plessis Robinson Cedex - France
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.vertigo.dynamo.export.model;

import io.vertigo.dynamo.domain.metamodel.DtDefinition;
import io.vertigo.dynamo.domain.metamodel.DtField;
import io.vertigo.dynamo.domain.metamodel.DtFieldName;
import io.vertigo.dynamo.domain.model.DtList;
import io.vertigo.dynamo.domain.model.DtObject;
import io.vertigo.dynamo.domain.util.DtObjectUtil;
import io.vertigo.lang.Assertion;
import io.vertigo.lang.Builder;
import io.vertigo.lang.MessageText;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Parametre d'export pour les données de type DT.
 * La particularité est que l'on fournit la liste des colonnes du DT a exporter,
 * avec éventuellement des paramètres d'affichage particulier pour une colonne.
 * @author pchretien, npiedeloup
 */
public final class ExportSheetBuilder implements Builder {
	/**
	 * List des champs à exporter
	 */
	private final List exportFields = new ArrayList<>();

	/**
	 * Objet à exporter. dto XOR dtc est renseigné.
	 */
	private final DtObject dto;
	private final DtList dtc;
	private final DtDefinition dtDefinition;

	private final String title;
	private final ExportBuilder exportBuilder;

	/**
	 * Constructor.
	 * @param exportBuilder Parent ExportBuilder
	 * @param dto Object to export
	 * @param title Sheet title
	 */
	ExportSheetBuilder(final ExportBuilder exportBuilder, final DtObject dto, final String title) {
		Assertion.checkNotNull(exportBuilder);
		Assertion.checkNotNull(dto);
		// title may be null
		//-----
		this.exportBuilder = exportBuilder;
		this.dto = dto;
		dtc = null;
		this.title = title;
		dtDefinition = DtObjectUtil.findDtDefinition(dto);
	}

	/**
	 * Constructor.
	 * @param exportBuilder Parent ExportBuilder
	 * @param dtc List to export
	 * @param title Sheet title
	 */
	ExportSheetBuilder(final ExportBuilder exportBuilder, final DtList dtc, final String title) {
		Assertion.checkNotNull(exportBuilder);
		Assertion.checkNotNull(dtc);
		// title may be null
		//-----
		this.exportBuilder = exportBuilder;
		this.dtc = dtc;
		dto = null;
		this.title = title;
		dtDefinition = dtc.getDefinition();
	}

	/**
	 * Ajoute un champs du Dt dans l'export, le label de la colonne sera celui indiqué dans le DT pour ce champs.
	 * @param fieldName ajout d'un champs du Dt à exporter
	 * @return ExportSheetBuilder
	 */
	public ExportSheetBuilder addField(final DtFieldName fieldName) {
		addField(fieldName, null);
		return this;
	}

	/**
	 * Ajoute un champs du Dt dans l'export, le label de la colonne sera celui indiqué dans le DT pour ce champs.
	 * @param fieldName ajout d'un champs du Dt à exporter
	 * @param list Liste des éléments dénormés
	 * @param displayfield Field du libellé à utiliser.
	 * @return ExportSheetBuilder
	 */
	public ExportSheetBuilder addField(final DtFieldName fieldName, final DtList list, final DtFieldName displayfield) {
		addField(fieldName, list, displayfield, null);
		return this;
	}

	/**
	 * @param fieldName ajout d'un champs du Dt à exporter
	 * @param overridedLabel nom spécifique à utiliser dans l'export, null si l'on souhaite utiliser celui indiqué dans le DT pour ce champs
	 * @return ExportSheetBuilder
	 */
	public ExportSheetBuilder addField(final DtFieldName fieldName, final MessageText overridedLabel) {
		Assertion.checkNotNull(fieldName);
		// On vérifie que la colonne est bien dans la définition de la DTC
		Assertion.checkArgument(dtDefinition.contains(fieldName.name()), "Le champ " + fieldName.name() + " n'est pas dans la liste à exporter");
		// On ne vérifie pas que les champs ne sont placés qu'une fois
		// car pour des raisons diverses ils peuvent l'être plusieurs fois.
		//-----
		final ExportField exportField = new ExportField(resolveDtField(fieldName), overridedLabel);
		exportFields.add(exportField);
		return this;
	}

	/**
	 * @param fieldName ajout d'un champs du Dt à exporter
	 * @param list Liste des éléments dénormés
	 * @param displayfield Field du libellé à utiliser.
	 * @param overridedLabel nom spécifique à utiliser dans l'export, null si l'on souhaite utiliser celui indiqué dans le DT pour ce champs
	 * @return ExportSheetBuilder
	 */
	public ExportSheetBuilder addField(final DtFieldName fieldName, final DtList list, final DtFieldName displayfield, final MessageText overridedLabel) {
		Assertion.checkNotNull(fieldName);
		// On vérifie que la colonne est bien dans la définition de la DTC
		Assertion.checkArgument(dtDefinition.contains(fieldName.name()), "Le champ " + fieldName.name() + " n'est pas dans la liste à exporter");
		Assertion.checkArgument(list.getDefinition().contains(displayfield.name()), "Le champ " + displayfield.name() + " n'est pas dans la liste de dénorm");
		// On ne vérifie pas que les champs ne sont placés qu'une fois
		// car pour des raisons diverses ils peuvent l'être plusieurs fois.
		//-----
		final ExportField exportField = new ExportDenormField(resolveDtField(fieldName), overridedLabel, list, resolveDtField(displayfield, list.getDefinition()));
		exportFields.add(exportField);
		return this;
	}

	/** {@inheritDoc} */
	@Override
	public ExportSheet build() {
		if (exportFields.isEmpty()) {
			// si la liste des colonnes est vide alors par convention on les
			// prend toutes.
			final Collection fields = dtDefinition.getFields();
			for (final DtField dtField : fields) {
				exportFields.add(new ExportField(dtField, null));
			}
		}
		return new ExportSheet(title, exportFields, dto, dtc);
	}

	/**
	 * Close sheet.
	 * @return ExportBuilder
	 */
	public ExportBuilder endSheet() {
		return exportBuilder.addSheet(build());
	}

	private DtField resolveDtField(final DtFieldName fieldName) {
		return resolveDtField(fieldName, dtDefinition);
	}

	private static DtField resolveDtField(final DtFieldName fieldName, final DtDefinition definition) {
		return definition.getField(fieldName);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy