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

com.agiletec.aps.system.common.entity.AbstractEntityDAO Maven / Gradle / Ivy

Go to download

Entando Engine: an agile, modern and user-centric open source Portal platform.

There is a newer version: 6.2.27
Show newest version
/*
 * Copyright 2015-Present Entando Inc. (http://www.entando.com) 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.agiletec.aps.system.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.agiletec.aps.system.common.AbstractDAO;
import com.agiletec.aps.system.common.entity.model.ApsEntityRecord;
import com.agiletec.aps.system.common.entity.model.AttributeSearchInfo;
import com.agiletec.aps.system.common.entity.model.IApsEntity;
import com.agiletec.aps.system.common.entity.model.attribute.AttributeInterface;
import com.agiletec.aps.system.common.util.EntityAttributeIterator;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.lang.ILangManager;
import java.sql.SQLException;

/**
 * Abstract DAO class used for the management of the ApsEntities.
 * @author E.Santoboni
 */
public abstract class AbstractEntityDAO extends AbstractDAO implements IEntityDAO {

	private static final Logger _logger =  LoggerFactory.getLogger(AbstractEntityDAO.class);
	
	@Override
	public void addEntity(IApsEntity entity) {
		Connection conn = null;
		try {
			conn = this.getConnection();
			conn.setAutoCommit(false);
			this.executeAddEntity(entity, conn);
			conn.commit();
		} catch (Throwable t) {
			this.executeRollback(conn);
			_logger.error("Error adding new entity",  t);
			throw new RuntimeException("Error adding new entity", t);
		} finally {
			this.closeConnection(conn);
		}
	}
	
	protected void executeAddEntity(IApsEntity entity, Connection conn) throws Throwable {
		PreparedStatement stat = null;
		try {
			stat = conn.prepareStatement(this.getAddEntityRecordQuery());
			this.buildAddEntityStatement(entity, stat);
			stat.executeUpdate();
			this.addEntitySearchRecord(entity.getId(), entity, conn);
			this.addEntityAttributeRoleRecord(entity.getId(), entity, conn);
		} catch (Throwable t) {
			throw t;
		} finally {
			this.closeDaoResources(null, stat);
		}
	}
	
	protected abstract String getAddEntityRecordQuery();
	
	protected abstract void buildAddEntityStatement(IApsEntity entity, PreparedStatement stat) throws Throwable;
	
	@Override
	public void deleteEntity(String entityId) {
		Connection conn = null;
		try {
			conn = this.getConnection();
			conn.setAutoCommit(false);
			this.executeDeleteEntity(entityId, conn);
			conn.commit();
		} catch (Throwable t) {
			_logger.error("Error deleting the entity by id '{}'", entityId,  t);
			throw new RuntimeException("Error deleting the entity by id", t);
		} finally {
			closeConnection(conn);
		}
	}
	
	protected void executeDeleteEntity(String entityId, Connection conn) throws Throwable {
		this.deleteRecordsByEntityId(entityId, this.getRemovingSearchRecordQuery(), conn);
		this.deleteRecordsByEntityId(entityId, this.getRemovingAttributeRoleRecordQuery(), conn);
		this.deleteRecordsByEntityId(entityId, this.getDeleteEntityRecordQuery(), conn);
	}
	
	protected abstract String getDeleteEntityRecordQuery();
	
	@Override
	public void updateEntity(IApsEntity entity) {
		Connection conn = null;
		try {
			conn = this.getConnection();
			conn.setAutoCommit(false);
			this.executeUpdateEntity(entity, conn);
			conn.commit();
		} catch (Throwable t) {
			this.executeRollback(conn);
			_logger.error("Error updating entity",  t);
			throw new RuntimeException("Error updating entity", t);
		} finally {
			this.closeConnection(conn);
		}
	}
	
	protected void executeUpdateEntity(IApsEntity entity, Connection conn) throws Throwable {
		PreparedStatement stat = null;
		try {
			this.deleteRecordsByEntityId(entity.getId(), this.getRemovingSearchRecordQuery(), conn);
			this.deleteRecordsByEntityId(entity.getId(), this.getRemovingAttributeRoleRecordQuery(), conn);
			stat = conn.prepareStatement(this.getUpdateEntityRecordQuery());
			this.buildUpdateEntityStatement(entity, stat);
			stat.executeUpdate();
			this.addEntitySearchRecord(entity.getId(), entity, conn);
			this.addEntityAttributeRoleRecord(entity.getId(), entity, conn);
		} catch (Throwable t) {
			throw t;
		} finally {
			this.closeDaoResources(null, stat);
		}
	}
	
	protected abstract String getUpdateEntityRecordQuery();
	
	protected abstract void buildUpdateEntityStatement(IApsEntity entity, PreparedStatement stat) throws Throwable;
	
	@Override
	public ApsEntityRecord loadEntityRecord(String id) {
		Connection conn = null;
		PreparedStatement stat = null;
		ResultSet res = null;
		ApsEntityRecord entityRecord = null;
		try {
			conn = this.getConnection();
			stat = conn.prepareStatement(this.getLoadEntityRecordQuery());
			stat.setString(1, id);
			res = stat.executeQuery();
			if (res.next()) {
				entityRecord = this.createEntityRecord(res);
			}
		} catch (Throwable t) {
			_logger.error("Error loading entity record '{}'", id,  t);
			throw new RuntimeException("Error loading entity record", t);
		} finally {
			closeDaoResources(res, stat, conn);
		}
		return entityRecord;
	}
	
	protected abstract String getLoadEntityRecordQuery();
	
	protected abstract ApsEntityRecord createEntityRecord(ResultSet res) throws Throwable;
	
	@Override
	public void reloadEntitySearchRecords(String id, IApsEntity entity) {
		Connection conn = null;
		try {
			conn = this.getConnection();
			conn.setAutoCommit(false);
			this.executeReloadEntitySearchRecords(id, entity, conn);
			conn.commit();
		} catch (Throwable t) {
			this.executeRollback(conn);
			_logger.error("Error detected while reloading references",  t);
			throw new RuntimeException("Error detected while reloading references", t);
		} finally {
			this.closeConnection(conn);
		}
	}
	
	protected void executeReloadEntitySearchRecords(String id, IApsEntity entity, Connection conn) throws Throwable {
		this.deleteRecordsByEntityId(id, this.getRemovingSearchRecordQuery(), conn);
		this.deleteRecordsByEntityId(id, this.getRemovingAttributeRoleRecordQuery(), conn);
		this.addEntitySearchRecord(id, entity, conn);
		this.addEntityAttributeRoleRecord(id, entity, conn);
	}
	
	protected void addEntitySearchRecord(String id, IApsEntity entity, Connection conn) throws ApsSystemException {
		PreparedStatement stat = null;
		try {
			stat = conn.prepareStatement(this.getAddingSearchRecordQuery());
			this.addEntitySearchRecord(id, entity, stat);
		} catch (Throwable t) {
			_logger.error("Error while adding a new record",  t);
			throw new RuntimeException("Error while adding a new record", t);
		} finally {
			closeDaoResources(null, stat);
		}
	}
	
	protected void addEntitySearchRecord(String id, IApsEntity entity, PreparedStatement stat) throws Throwable {
		EntityAttributeIterator attributeIter = new EntityAttributeIterator(entity);
		while (attributeIter.hasNext()) {
			AttributeInterface currAttribute = (AttributeInterface) attributeIter.next();
			List infos = currAttribute.getSearchInfos(this.getLangManager().getLangs());
			if (currAttribute.isSearchable() && null != infos) {
				for (int i=0; i attributes = entity.getAttributeList();
		for (int i = 0; i < attributes.size(); i++) {
			AttributeInterface currAttribute = attributes.get(i);
			String[] roleNames = currAttribute.getRoles();
			if (null != roleNames && roleNames.length > 0) {
				for (int j = 0; j < roleNames.length; j++) {
					String roleName = roleNames[j];
					stat.setString(1, id);
					stat.setString(2, currAttribute.getName());
					stat.setString(3, roleName);
					stat.addBatch();
					stat.clearParameters();
				}
			}
		}
		stat.executeBatch();
	}
	
	protected void deleteEntitySearchRecord(String id, Connection conn) throws ApsSystemException {
		this.deleteRecordsByEntityId(id, this.getRemovingSearchRecordQuery(), conn);
	}
	
	/**
	 * 'Utility' method. Delete entity records by entity id
	 * @param entityId the entity id to use for deleting records.
	 * @param query The sql query
	 * @param conn The connection.
	 */
	protected void deleteRecordsByEntityId(String entityId, String query, Connection conn) {
		PreparedStatement stat = null;
		try {
			stat = conn.prepareStatement(query);
			stat.setString(1, entityId);
			stat.executeUpdate();
		} catch (Throwable t) {
			_logger.error("Error deleting entity records by id '{}'", entityId,  t);
			throw new RuntimeException("Error deleting entity records by id " + entityId, t);
		} finally {
			closeDaoResources(null, stat);
		}
	}
	
	/**
	 * @deprecated deprecated from jAPS 2.0 version 2.0.9
	 */
	@Override
	public List getAllEntityId() {
		Connection conn = null;
		Statement stat = null;
		ResultSet res = null;
		List entitiesId = new ArrayList<>();
		try {
			conn = this.getConnection();
			stat = conn.createStatement();
			res = stat.executeQuery(this.getExtractingAllEntityIdQuery());
			while (res.next()) {
				entitiesId.add(res.getString(1));
			}
		} catch (ApsSystemException | SQLException t) {
			_logger.error("Error retrieving the list of entity IDs",  t);
			throw new RuntimeException("Error retrieving the list of entity IDs", t);
		} finally {
			closeDaoResources(res, stat, conn);
		}
		return entitiesId;
	}
	
	/**
	 * Return the specific query to add a new record of informations in the
	 * support database.
	 * The query must respect the following positions of the elements:
* Position 1: entity ID
* Position 2: attribute name
* Position 3: searchable string
* Position 4: searchable data
* Position 5: searchable number
* Position 6: Language code * @return the query to add a look up record for the entity search. */ protected abstract String getAddingSearchRecordQuery(); protected abstract String getAddingAttributeRoleRecordQuery(); /** * Return the query to delete the record associated to an entity. The returned query will only need * the declaration of the ID of the entity to delete. * @return The query to delete the look up record of a single entity. */ protected abstract String getRemovingSearchRecordQuery(); protected abstract String getRemovingAttributeRoleRecordQuery(); /** * Return the query that extracts the list of entity IDs. * @return The query that extracts the list of entity IDs. * @deprecated As of jAPS 2.0 version 2.0.9 */ protected abstract String getExtractingAllEntityIdQuery(); protected ILangManager getLangManager() { return _langManager; } public void setLangManager(ILangManager langManager) { this._langManager = langManager; } private ILangManager _langManager; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy