// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.repository.model.migration; import java.util.Date; import java.util.GregorianCalendar; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xmi.XMIResource; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.model.general.Project; import org.talend.core.model.migration.AbstractJobMigrationTask; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.relationship.RelationshipItemBuilder; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.repository.RepositoryObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.repository.utils.XmiResourceManager; /** * This migration task must be run each time, not only one time. Not standard migration task. This is to try to keep the * relation cache updated each time, no matter of bug / manual update from user or such. */ public class AutoUpdateRelationsMigrationTask extends AbstractJobMigrationTask { private XmiResourceManager rM; public AutoUpdateRelationsMigrationTask() { rM = ProxyRepositoryFactory.getInstance().getRepositoryFactoryFromProvider().getResourceManager(); } @Override public ExecutionResult execute(Project project) { ExecutionResult result = super.execute(project); RelationshipItemBuilder.getInstance().saveRelations(); return result; } @Override public ExecutionResult execute(Item item) { try { RelationshipItemBuilder.getInstance().addOrUpdateItem(item, true); // should make both the item resource and property resource to be unreachable objects so that JVM can // release the memory when gc if (item instanceof ProcessItem) { Resource processResource = ((ProcessItem) item).getProcess().eResource(); Resource propertyResource = item.eResource(); if (processResource != null && processResource.isLoaded() && (processResource instanceof XMIResource)) { propertyResource.unload(); processResource.unload(); rM.resourceSet.getResources().remove(propertyResource); rM.resourceSet.getResources().remove(processResource); } } } catch (Exception e) { ExceptionHandler.process(new Exception("Error in item:" + item.getProperty().getLabel(), e)); } return ExecutionResult.SUCCESS_NO_ALERT; } public Date getOrder() { GregorianCalendar gc = new GregorianCalendar(2050, 02, 12, 12, 0, 0); return gc.getTime(); } @Override public void unloadObject(IRepositoryViewObject object) { if (object instanceof RepositoryObject) { RepositoryObject obj = (RepositoryObject) object; obj.unload(); } } }