/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Cyclos 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package nl.strohalm.cyclos.setup.migrations.version3_5;
import static nl.strohalm.cyclos.utils.JDBCWrapper.closeQuietly;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
import java.util.ResourceBundle;
import nl.strohalm.cyclos.entities.settings.LocalSettings.Language;
import nl.strohalm.cyclos.setup.Setup;
import nl.strohalm.cyclos.setup.UntraceableMigration;
import nl.strohalm.cyclos.utils.JDBCWrapper;
import nl.strohalm.cyclos.utils.conversion.CoercionHelper;
/**
* Creates a new record type named "Remark" and populates it with data from the old general remarks. After copying the data, removes the general
* remarks entries in the database, including modules, operations and permissions.
* @author Jefferson Magno
*/
@SuppressWarnings("deprecation")
public class GeneralRemarksMigration implements UntraceableMigration {
public void execute(final JDBCWrapper jdbc) throws SQLException {
// Get resource bundle object
final String languageStr = jdbc.readScalarAsString("select value from settings where name='language'");
final Language language = CoercionHelper.coerce(Language.class, languageStr);
final ResourceBundle resourceBundle = Setup.getResourceBundle(language.getLocale());
// Get resource bundle values
final String remarkName = resourceBundle.getString("remarks.name");
final String remarkLabel = resourceBundle.getString("remarks.label");
final String remarkDescription = resourceBundle.getString("remarks.description");
final String commentsName = resourceBundle.getString("remarks.comments");
final String commentsInternalName = resourceBundle.getString("remarks.comments.internalName");
final String commentsDescription = resourceBundle.getString("remarks.comments.description");
// Insert record type
final String insertRemarkRecordType = "insert into member_record_types (name, label, editable, layout, description, show_menu_item) values (?, ?, false, 'F', ?, true)";
final Object[] remarkRecordTypeParams = new Object[] { remarkName, remarkLabel, remarkDescription };
jdbc.execute(insertRemarkRecordType, remarkRecordTypeParams);
final Long memberRecordTypeId = jdbc.readScalarAsLong("select last_insert_id()");
// Insert 'comments' custom field for the 'Remark' record type
final String insertCommentsCustomField = "insert into custom_fields (subclass, name, internal_name, order_number, type, control, size, val_required, val_unique, description, member_record_type_id, record_broker_access, record_show_in_search, record_show_in_list) values ('record', ?, ?, 1, 'string', 'textarea', 'F', true, false, ?, ?, 'E', false, true)";
final Object[] commentsCustomFieldParams = new Object[] { commentsName, commentsInternalName, commentsDescription, memberRecordTypeId };
jdbc.execute(insertCommentsCustomField, commentsCustomFieldParams);
final Long commentsCustomFieldId = jdbc.readScalarAsLong("select last_insert_id()");
// All groups can use 'Remark' record type
final List<Long> groupsIds = jdbc.readScalarAsLongList("select id from groups");
for (final Long groupId : groupsIds) {
final String insertGroupRecordTypes = "insert into groups_member_record_types (group_id, member_record_type_id) values (?, ?)";
final Object[] groupRecordTypesParams = new Object[] { groupId, memberRecordTypeId };
jdbc.execute(insertGroupRecordTypes, groupRecordTypesParams);
}
// Create modules and operations
// Module adminAdminRecords
Long adminAdminRecordsModuleId;
try {
final String insertAdminAdminRecordsModule = "insert into modules (type, name, message_key) values ('AA', 'adminAdminRecords', 'permission.adminAdminRecords')";
jdbc.execute(insertAdminAdminRecordsModule);
adminAdminRecordsModuleId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
adminAdminRecordsModuleId = jdbc.readScalarAsLong("select id from modules where name='adminAdminRecords'");
}
// Operation create of module adminAdminRecords
Long createAdminRecordsOperationId;
try {
final String insertCreateAdminRecords = "insert into operations (module_id, name, message_key) values (?, 'create', 'permission.adminAdminRecords.create')";
final Object[] createAdminRecordsParams = new Object[] { adminAdminRecordsModuleId };
jdbc.execute(insertCreateAdminRecords, createAdminRecordsParams);
createAdminRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
createAdminRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key ='permission.adminAdminRecords.create'");
}
// Operation modify of module adminAdminRecords
Long modifyAdminRecordsOperationId;
try {
final String insertModifyAdminRecords = "insert into operations (module_id, name, message_key) values (?, 'modify', 'permission.adminAdminRecords.modify')";
final Object[] modifyAdminRecordsParams = new Object[] { adminAdminRecordsModuleId };
jdbc.execute(insertModifyAdminRecords, modifyAdminRecordsParams);
modifyAdminRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
modifyAdminRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key ='permission.adminAdminRecords.modify'");
}
// Operation delete of module adminAdminRecords
Long deleteAdminRecordsOperationId;
try {
final String insertDeleteAdminRecords = "insert into operations (module_id, name, message_key) values (?, 'delete', 'permission.adminAdminRecords.delete')";
final Object[] deleteAdminRecordsParams = new Object[] { adminAdminRecordsModuleId };
jdbc.execute(insertDeleteAdminRecords, deleteAdminRecordsParams);
deleteAdminRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
deleteAdminRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key ='permission.adminAdminRecords.delete'");
}
// Operation view of module adminAdminRecords
Long viewAdminRecordsOperationId;
try {
final String insertViewAdminRecords = "insert into operations (module_id, name, message_key) values (?, 'view', 'permission.adminAdminRecords.view')";
final Object[] viewAdminRecordsParams = new Object[] { adminAdminRecordsModuleId };
jdbc.execute(insertViewAdminRecords, viewAdminRecordsParams);
viewAdminRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
viewAdminRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminAdminRecords.view'");
}
// Module adminMemberRecords
Long adminMemberRecordsModuleId;
try {
final String insertAdminMemberRecordsModule = "insert into modules (type, name, message_key) values ('AM', 'adminMemberRecords', 'permission.adminMemberRecords')";
jdbc.execute(insertAdminMemberRecordsModule);
adminMemberRecordsModuleId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
adminMemberRecordsModuleId = jdbc.readScalarAsLong("select id from modules where name='adminMemberRecords'");
}
// Operation create of module adminMemberRecords
Long createMemberRecordsOperationId;
try {
final String insertCreateMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'create', 'permission.adminMemberRecords.create')";
final Object[] createMemberRecordsParams = new Object[] { adminMemberRecordsModuleId };
jdbc.execute(insertCreateMemberRecords, createMemberRecordsParams);
createMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
createMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminMemberRecords.create'");
}
// Operation modify of module adminMemberRecords
Long modifyMemberRecordsOperationId;
try {
final String insertModifyMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'modify', 'permission.adminMemberRecords.modify')";
final Object[] modifyMemberRecordsParams = new Object[] { adminMemberRecordsModuleId };
jdbc.execute(insertModifyMemberRecords, modifyMemberRecordsParams);
modifyMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
modifyMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminMemberRecords.modify'");
}
// Operation delete of module adminMemberRecords
Long deleteMemberRecordsOperationId;
try {
final String insertDeleteMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'delete', 'permission.adminMemberRecords.delete')";
final Object[] deleteMemberRecordsParams = new Object[] { adminMemberRecordsModuleId };
jdbc.execute(insertDeleteMemberRecords, deleteMemberRecordsParams);
deleteMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
deleteMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminMemberRecords.delete'");
}
// Operation view of module adminMemberRecords
Long viewMemberRecordsOperationId;
try {
final String insertViewMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'view', 'permission.adminMemberRecords.view')";
final Object[] viewMemberRecordsParams = new Object[] { adminMemberRecordsModuleId };
jdbc.execute(insertViewMemberRecords, viewMemberRecordsParams);
viewMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
viewMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminMemberRecords.view'");
}
// Module brokerMemberRecords
Long brokerMemberRecordsModuleId;
try {
final String insertBrokerMemberRecordsModule = "insert into modules (type, name, message_key) values ('BK', 'brokerMemberRecords', 'permission.brokerMemberRecords')";
jdbc.execute(insertBrokerMemberRecordsModule);
brokerMemberRecordsModuleId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
brokerMemberRecordsModuleId = jdbc.readScalarAsLong("select id from modules where name='brokerMemberRecords'");
}
// Operation create of module brokerMemberRecords
Long brokerCreateMemberRecordsOperationId;
try {
final String insertBrokerCreateMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'create', 'permission.brokerMemberRecords.create')";
final Object[] brokerCreateMemberRecordsParams = new Object[] { brokerMemberRecordsModuleId };
jdbc.execute(insertBrokerCreateMemberRecords, brokerCreateMemberRecordsParams);
brokerCreateMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
brokerCreateMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.brokerMemberRecords.create'");
}
// Operation modify of module brokerMemberRecords
Long brokerModifyMemberRecordsOperationId;
try {
final String insertBrokerModifyMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'modify', 'permission.brokerMemberRecords.modify')";
final Object[] brokerModifyMemberRecordsParams = new Object[] { brokerMemberRecordsModuleId };
jdbc.execute(insertBrokerModifyMemberRecords, brokerModifyMemberRecordsParams);
brokerModifyMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
brokerModifyMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.brokerMemberRecords.modify'");
}
// Operation delete of module brokerMemberRecords
Long brokerDeleteMemberRecordsOperationId;
try {
final String insertBrokerDeleteMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'delete', 'permission.brokerMemberRecords.delete')";
final Object[] brokerDeleteMemberRecordsParams = new Object[] { brokerMemberRecordsModuleId };
jdbc.execute(insertBrokerDeleteMemberRecords, brokerDeleteMemberRecordsParams);
brokerDeleteMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
brokerDeleteMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.brokerMemberRecords.delete'");
}
// Operation view of module brokerMemberRecords
Long brokerViewMemberRecordsOperationId;
try {
final String insertBrokerViewMemberRecords = "insert into operations (module_id, name, message_key) values (?, 'view', 'permission.brokerMemberRecords.view')";
final Object[] brokerViewMemberRecordsParams = new Object[] { brokerMemberRecordsModuleId };
jdbc.execute(insertBrokerViewMemberRecords, brokerViewMemberRecordsParams);
brokerViewMemberRecordsOperationId = jdbc.readScalarAsLong("select last_insert_id()");
} catch (final Exception e) {
brokerViewMemberRecordsOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.brokerMemberRecords.view'");
}
// SQLs and objects for select and insert group permissions
final String selectGroupsWithPermission = "select group_id from permissions where operation_id = ?";
Object[] groupsWithPermissionParams;
List<Long> ids;
final String insertGroupPermission = "insert into permissions (operation_id, group_id) values (?, ?)";
Object[] groupPermissionParams;
// SQLs for insert association between groups and member record types (view permission)
final String insertAdminViewMemberRecordTypes = "insert into admin_groups_member_record_types (group_id, member_record_type_id) values (?, ?)";
Object[] adminViewMemberRecordTypesParams;
final String insertAdminViewAdminRecordTypes = "insert into admin_groups_admin_record_types (group_id, member_record_type_id) values (?, ?)";
Object[] adminViewAdminRecordTypesParams;
final String insertBrokerViewMemberRecordTypes = "insert into broker_groups_member_record_types (group_id, member_record_type_id) values (? , ?)";
Object[] brokerViewMemberRecordTypesParams;
// Grant permissions to admin groups
final Long adminViewMemberRemarksOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminMemberRemarks.view'");
groupsWithPermissionParams = new Object[] { adminViewMemberRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { viewMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
try {
adminViewMemberRecordTypesParams = new Object[] { groupId, memberRecordTypeId };
jdbc.execute(insertAdminViewMemberRecordTypes, adminViewMemberRecordTypesParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
final Long adminManageMemberRemarksOperationId = jdbc.readScalarAsLong("select * from operations where message_key='permission.adminMemberRemarks.manage'");
groupsWithPermissionParams = new Object[] { adminManageMemberRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { createMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { modifyMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { deleteMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
final Long adminViewAdminRemarksOperationId = jdbc.readScalarAsLong("select id from operations where message_key='permission.adminAdminRemarks.view'");
groupsWithPermissionParams = new Object[] { adminViewAdminRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { viewAdminRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
try {
adminViewAdminRecordTypesParams = new Object[] { groupId, memberRecordTypeId };
jdbc.execute(insertAdminViewAdminRecordTypes, adminViewAdminRecordTypesParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
final Long adminManageAdminRemarksOperationId = jdbc.readScalarAsLong("select * from operations where message_key='permission.adminAdminRemarks.manage'");
groupsWithPermissionParams = new Object[] { adminManageAdminRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { createAdminRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { modifyAdminRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { deleteAdminRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
// Grant permissions to broker groups
final Long brokerViewMemberRemarksOperationId = jdbc.readScalarAsLong("select * from operations where message_key='permission.brokerRemarks.view'");
groupsWithPermissionParams = new Object[] { brokerViewMemberRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { brokerViewMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
try {
brokerViewMemberRecordTypesParams = new Object[] { groupId, memberRecordTypeId };
jdbc.execute(insertBrokerViewMemberRecordTypes, brokerViewMemberRecordTypesParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
final Long brokerManageMemberRemarksOperationId = jdbc.readScalarAsLong("select * from operations where message_key='permission.brokerRemarks.manage'");
groupsWithPermissionParams = new Object[] { brokerManageMemberRemarksOperationId };
ids = jdbc.readScalarAsLongList(selectGroupsWithPermission, groupsWithPermissionParams);
for (final Long groupId : ids) {
try {
groupPermissionParams = new Object[] { brokerCreateMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { brokerModifyMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
groupPermissionParams = new Object[] { brokerDeleteMemberRecordsOperationId, groupId };
jdbc.execute(insertGroupPermission, groupPermissionParams);
} catch (final Exception e) {
e.printStackTrace();
}
}
// Remove remarks permissions
final String deletePermissions = "delete from permissions where operation_id in (?, ?, ?, ?, ?, ?)";
final Object[] deletePermissionsParams = new Object[] { adminViewMemberRemarksOperationId, adminManageMemberRemarksOperationId, adminViewAdminRemarksOperationId, adminManageAdminRemarksOperationId, brokerViewMemberRemarksOperationId, brokerManageMemberRemarksOperationId };
jdbc.execute(deletePermissions, deletePermissionsParams);
// Remove remarks operations
final String deleteOperations = "delete from operations where id in (?, ?, ?, ?, ?, ?)";
final Object[] deleteOperationsParams = new Object[] { adminViewMemberRemarksOperationId, adminManageMemberRemarksOperationId, adminViewAdminRemarksOperationId, adminManageAdminRemarksOperationId, brokerViewMemberRemarksOperationId, brokerManageMemberRemarksOperationId };
jdbc.execute(deleteOperations, deleteOperationsParams);
// Remove remarks modules
final Long adminAdminRemarksModuleId = jdbc.readScalarAsLong("select id from modules where name='adminAdminRemarks'");
final Long adminMemberRemarksModuleId = jdbc.readScalarAsLong("select id from modules where name='adminMemberRemarks'");
final Long brokerMemberRemarksModuleId = jdbc.readScalarAsLong("select id from modules where name='brokerRemarks'");
final String deleteModules = "delete from modules where id in (?, ?, ?)";
final Object[] deleteModulesParams = new Object[] { adminAdminRemarksModuleId, adminMemberRemarksModuleId, brokerMemberRemarksModuleId };
jdbc.execute(deleteModules, deleteModulesParams);
// Search remarks of type 'general'
final String remarksQuery = "select subject_id, writer_id, date, comments from remarks where subclass='R'";
final ResultSet rsRemarks = jdbc.query(remarksQuery);
while (rsRemarks.next()) {
final Long elementId = rsRemarks.getLong("subject_id");
final Long byId = rsRemarks.getLong("writer_id");
final Timestamp date = rsRemarks.getTimestamp("date");
final String comments = rsRemarks.getString("comments");
// Create a new member record for each remark
final String insertMemberRecord = "insert into member_records (member_record_type_id, element_id, by_id, date) values (?, ?, ?, ?)";
final Object[] memberRecordParams = new Object[] { memberRecordTypeId, elementId, byId, date };
jdbc.execute(insertMemberRecord, memberRecordParams);
final Long memberRecordId = jdbc.readScalarAsLong("select last_insert_id()");
// Create a new custom field value for each remark
final String insertComments = "insert into custom_field_values (subclass, field_id, string_value, member_record_id) values ('record', ?, ?, ?)";
final Object[] commentsParams = new Object[] { commentsCustomFieldId, comments, memberRecordId };
jdbc.execute(insertComments, commentsParams);
}
closeQuietly(rsRemarks);
// Remove general remarks
final String removeGeneralRemarks = "delete from remarks where subclass='R'";
jdbc.execute(removeGeneralRemarks);
}
}