view src/main/java/org/mpi/openmind/scripts/MigratePrimeAliases.java @ 112:933d17f95016

new script MigratePrimeAliases to migrate is_prime_alias_X_of.
author Robert Casties <casties@mpiwg-berlin.mpg.de>
date Wed, 14 Aug 2019 20:48:02 +0200
parents
children 8acfd380fffe
line wrap: on
line source

/**
 * 
 */
package org.mpi.openmind.scripts;

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

import org.apache.log4j.Logger;
import org.mpi.openmind.cache.WrapperService;
import org.mpi.openmind.repository.bo.Entity;
import org.mpi.openmind.repository.bo.Relation;
import org.mpi.openmind.repository.services.ServiceRegistry;

/**
 * @author casties
 *
 */
public class MigratePrimeAliases {
	private static final String migrateUser = "migrate-alias user";
	
	private static Logger logger = Logger.getLogger(MigratePrimeAliases.class);
	
	protected static void migrate(String oldRelation, String newRelation, WrapperService wrapper) {

		List<Entity> deleteList = new ArrayList<Entity>();
		List<Entity> saveList = new ArrayList<Entity>();
		
		int cnt = 0;
		List<Entity> aliasList = wrapper.getEntitiesByDef("ALIAS");
        for (Entity alias : aliasList) {
        	if (alias.isLightweight()) {
        		alias = wrapper.getEntityContent(alias);
        	}
        	// get relation
        	List<Relation> rels = alias.getSourceRelations(oldRelation, "*");
        	if (rels.isEmpty()) continue;
        	if (rels.size() > 1) {
        		logger.error("ALIAS has more than one relation!");
        		System.exit(1);
        	}
        	Relation rel = rels.get(0);
    		Entity tar = wrapper.getEntityById(rel.getTargetId());
        	if (tar.isLightweight()) {
        		tar = wrapper.getEntityContent(tar);
        	}
        	boolean aliasExists = false;
        	// get other aliases of target
        	List<Relation> otherrels = tar.getTargetRelations(newRelation, "ALIAS");
        	for (Relation otherrel : otherrels) {
        		Entity otheralias = wrapper.getEntityById(otherrel.getSourceId());
        		// compare ownvalue
        		if (alias.getOwnValue().equals(otheralias.getOwnValue())) {
        			aliasExists = true;
        			break;
        		}
        	}
        	if (aliasExists) {
        		deleteList.add(alias);
        	} else {
        		// change relation
        		rel.setOwnValue(newRelation);
        		rel.setObjectClass(newRelation);
        		saveList.add(alias);
        	}
        	if (++cnt % 100 == 0) {
        		logger.debug(cnt+" aliases...");
        	}
        }
        // delete obsolete aliases
        for (Entity alias : deleteList) {
        	try {
        		logger.debug("Deleting obsolete alias: "+alias);
				wrapper.removeCurrentVersionEntity(alias, migrateUser);
			} catch (Exception e) {
				logger.error("Error deleting alias!", e);
			}
        }
        // save changed aliases
        for (Entity alias: saveList) {
	        try {
        		logger.debug("Saving changed alias: "+alias);
				wrapper.saveEntity(alias, migrateUser, null);
			} catch (Exception e) {
				logger.error("Error saving changed aliases!", e);
			}
        }
        logger.info("Deleted "+deleteList.size()+" aliases.");
        logger.info("Changed "+saveList.size()+" aliases.");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ServiceRegistry services = new ServiceRegistry();
		services.getWrapper();

		logger.info("Migrating ALIAS from is_prime_alias_name_of to is_alias_name_of");
		migrate("is_prime_alias_name_of", "is_alias_name_of", services.getWrapper());

		logger.info("Migrating ALIAS from is_prime_alias_title_of to is_alias_title_of");
		migrate("is_prime_alias_title_of", "is_alias_title_of", services.getWrapper());

		System.exit(0);
	}

}