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

io.vertigo.dynamo.domain.util.DtObjectUtil Maven / Gradle / Ivy

There is a newer version: 2.1.0
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.domain.util;

import io.vertigo.app.Home;
import io.vertigo.core.spaces.definiton.Definition;
import io.vertigo.core.spaces.definiton.DefinitionUtil;
import io.vertigo.dynamo.domain.metamodel.DtDefinition;
import io.vertigo.dynamo.domain.metamodel.DtField;
import io.vertigo.dynamo.domain.metamodel.Dynamic;
import io.vertigo.dynamo.domain.metamodel.association.AssociationNNDefinition;
import io.vertigo.dynamo.domain.metamodel.association.AssociationSimpleDefinition;
import io.vertigo.dynamo.domain.metamodel.association.DtListURIForNNAssociation;
import io.vertigo.dynamo.domain.metamodel.association.DtListURIForSimpleAssociation;
import io.vertigo.dynamo.domain.model.DtObject;
import io.vertigo.dynamo.domain.model.DynaDtObject;
import io.vertigo.dynamo.domain.model.URI;
import io.vertigo.lang.Assertion;
import io.vertigo.util.ClassUtil;
import io.vertigo.util.StringUtil;

/**
 * The DtObjectUtil class is a set of utils about the DtObject. 
 *
 * @author pchretien
 */
public final class DtObjectUtil {
	private static final String DT_DEFINITION_PREFIX = DefinitionUtil.getPrefix(DtDefinition.class);
	private static final char SEPARATOR = Definition.SEPARATOR;

	private DtObjectUtil() {
		//private constructor.
	}

	/**
	 * Creates a new instance of 'DtObject' from a 'DtDefinition'.
	 *
	 * @return the new instance
	 */
	public static DtObject createDtObject(final DtDefinition dtDefinition) {
		Assertion.checkNotNull(dtDefinition);
		//-----
		if (dtDefinition.isDynamic()) {
			return new DynaDtObject(dtDefinition);
		}
		//La création des DtObject n'est pas sécurisée
		return ClassUtil.newInstance(dtDefinition.getClassCanonicalName(), DtObject.class);
	}

	/**
	 * Returns the 'id' of a 'DtObject'.
	 * @return the id of the specified 'DtObject'
	 */
	public static Object getId(final DtObject dto) {
		Assertion.checkNotNull(dto);
		//-----
		final DtDefinition dtDefinition = findDtDefinition(dto);
		final DtField idField = dtDefinition.getIdField().get();
		return idField.getDataAccessor().getValue(dto);
	}

	/**
	 * Récupération d'une URI de DTO.
	 * On récupère l'URI d'un DTO à partir de sa classe et sa clée.
	 * @param dtObjectClass Class du DTO
	 * @param uriValue key value
	 * @param  DtObject type
	 * @return URI du DTO
	 */
	public static  URI createURI(final Class dtObjectClass, final Object uriValue) {
		final DtDefinition dtDefinition = DtObjectUtil.findDtDefinition(dtObjectClass);
		return new URI<>(dtDefinition, uriValue);
	}

	/**
	 * Récupération d'une URI de DTO.
	 * On récupère l'URI d'un DTO référencé par une association.
	 * Il est nécessaire que l'association soit simple.
	 * Si l'association est multiple on ne récupère pas une URI mais une DtListURI, c'est à dire le pointeur vers une liste.
	 *
	 *  On recherche une URI correspondant à une association.
	 *  Exemple : Une Commande possède un bénéficiaire.
	 *  Dans cetexemple on recherche l'URI du bénéficiaire à partir de l'objet commande.

	 * @param associationDefinitionName Nom de la définition d'une association
	 * @param dto DtObject
	 * @return URI du DTO relié via l'association au dto passé en paramètre (Nullable)
	 */
	public static  URI createURI(final DtObject dto, final String associationDefinitionName, final Class dtoTargetClass) {
		Assertion.checkNotNull(associationDefinitionName);
		Assertion.checkNotNull(dto);
		Assertion.checkNotNull(dtoTargetClass);
		//-----
		final AssociationSimpleDefinition associationSimpleDefinition = Home.getApp().getDefinitionSpace().resolve(associationDefinitionName, AssociationSimpleDefinition.class);
		// 1. On recherche le nom du champ portant l'objet référencé (Exemple : personne)
		final DtDefinition dtDefinition = associationSimpleDefinition.getPrimaryAssociationNode().getDtDefinition();

		// 2. On calcule le nom de la fk.
		final DtField fkField = associationSimpleDefinition.getFKField();

		// 3. On calcule l'URI de la clé étrangère
		final Object id = fkField.getDataAccessor().getValue(dto);
		if (id == null) {
			return null;
		}
		return new URI(dtDefinition, id);
	}

	/**
	 * Récupération d'une URI de Collection à partir d'un dto
	 * @param dto DtObject
	 * @param associationDefinitionName Nom de l'association
	 * @param roleName Nom du role
	 * @return URI de la collection référencée.
	 */
	public static DtListURIForSimpleAssociation createDtListURIForSimpleAssociation(final DtObject dto, final String associationDefinitionName, final String roleName) {
		Assertion.checkNotNull(associationDefinitionName);
		Assertion.checkNotNull(roleName);
		Assertion.checkNotNull(dto);
		//-----
		final AssociationSimpleDefinition associationDefinition = Home.getApp().getDefinitionSpace().resolve(associationDefinitionName, AssociationSimpleDefinition.class);
		return new DtListURIForSimpleAssociation(associationDefinition, createURI(dto), roleName);
	}

	/**
	 * Récupération d'une URI de Collection à partir d'un dto
	 * @param dto DtObject
	 * @param associationDefinitionName Nom de l'association
	 * @param roleName Nom du role
	 * @return URI de la collection référencée.
	 */
	public static DtListURIForNNAssociation createDtListURIForNNAssociation(final DtObject dto, final String associationDefinitionName, final String roleName) {
		Assertion.checkNotNull(associationDefinitionName);
		Assertion.checkNotNull(roleName);
		Assertion.checkNotNull(dto);
		//-----
		final AssociationNNDefinition associationDefinition = Home.getApp().getDefinitionSpace().resolve(associationDefinitionName, AssociationNNDefinition.class);
		return new DtListURIForNNAssociation(associationDefinition, createURI(dto), roleName);
	}

	private static URI createURI(final DtObject dto) {
		Assertion.checkNotNull(dto);
		//-----
		final DtDefinition dtDefinition = findDtDefinition(dto);
		return new URI(dtDefinition, DtObjectUtil.getId(dto));
	}

	/**
	 * Représentation sous forme text d'un dtObject.
	 * @param dto dtObject
	 * @return Représentation sous forme text du dtObject.
	 */
	public static String toString(final DtObject dto) {
		Assertion.checkNotNull(dto);
		//-----
		final StringBuilder stringBuilder = new StringBuilder()
				.append(findDtDefinition(dto).getName())
				.append('(');
		boolean first = true;
		for (final DtField dtField : findDtDefinition(dto).getFields()) {
			if (!first) {
				stringBuilder.append(", ");
			}
			stringBuilder.append(dtField.getName()).append('=');
			stringBuilder.append(dtField.getDataAccessor().getValue(dto));
			first = false;
		}
		stringBuilder.append(')');
		return stringBuilder.toString();
	}

	/**
	 * Finds the definition to which the specified 'DtObject' is mapped.
	 * @param dto DtObject
	 * @return the id 
	 */
	public static DtDefinition findDtDefinition(final DtObject dto) {
		Assertion.checkNotNull(dto);
		//-----
		if (dto instanceof Dynamic) {
			return Dynamic.class.cast(dto).getDefinition();
		}
		return findDtDefinition(dto.getClass());
	}

	/**
	 * Finds the definition from a type of 'DtObject'
	 * @param dtObjectClass  the type of the 'DtObject'
	 * @return the id 
	 */
	public static DtDefinition findDtDefinition(final Class dtObjectClass) {
		Assertion.checkNotNull(dtObjectClass);
		//-----
		final String name = DT_DEFINITION_PREFIX + SEPARATOR + StringUtil.camelToConstCase(dtObjectClass.getSimpleName());
		return Home.getApp().getDefinitionSpace().resolve(name, DtDefinition.class);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy