// ============================================================================ // // 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.core.model.migration; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.log4j.Logger; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.general.Project; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.repository.RepositoryObject; import org.talend.core.runtime.i18n.Messages; import org.talend.migration.AbstractMigrationTask; import org.talend.migration.IProjectMigrationTask; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IRepositoryService; /** */ public abstract class AbstractItemMigrationTask extends AbstractMigrationTask implements IProjectMigrationTask { private static Logger log = Logger.getLogger(AbstractItemMigrationTask.class); private Project project; private ExecutionResult status; public ExecutionResult execute(Project project) { setProject(project); IRepositoryService service = (IRepositoryService) GlobalServiceRegister.getDefault().getService(IRepositoryService.class); IProxyRepositoryFactory factory = service.getProxyRepositoryFactory(); ExecutionResult executeFinal = null; List<IRepositoryViewObject> list = new ArrayList<IRepositoryViewObject>(); try { for (ERepositoryObjectType curTyp : getTypes()) { if (curTyp.isResourceItem()) { /* specific project so that on svn model it will migrate all ref projects,bug 17295 */ list.addAll(factory.getAll(project, curTyp, true, true)); } } if (list.isEmpty()) { return ExecutionResult.NOTHING_TO_DO; } for (IRepositoryViewObject object : list) { ExecutionResult execute = null; // in case the resource has been modified (see MergeTosMetadataMigrationTask for example) if ((object.getProperty().eResource() == null || object.getProperty().getItem().eResource() == null) && (object instanceof RepositoryObject)) { Property updatedProperty = factory.reload(object.getProperty()); ((RepositoryObject) object).setProperty(updatedProperty); } Item item = object.getProperty().getItem(); execute = execute(item); unloadObject(object); // if (item.getProperty().eResource().isModified()) { // factory.save(item, true); // item.getProperty().eResource().setModified(false); // } if (execute == ExecutionResult.FAILURE) { log.warn(Messages.getString( "AbstractItemMigrationTask.taskFailed", this.getName(), item.getProperty().getLabel())); //$NON-NLS-1$ executeFinal = ExecutionResult.FAILURE; } if (executeFinal != ExecutionResult.FAILURE) { executeFinal = execute; } } return executeFinal; } catch (PersistenceException e) { ExceptionHandler.process(e); return ExecutionResult.FAILURE; } } public ExecutionResult execute(Project project, Item item) { if (!getTypes().contains(ERepositoryObjectType.getItemType(item))) { return ExecutionResult.NOTHING_TO_DO; } setProject(project); return execute(item); } public abstract ExecutionResult execute(Item item); // if need to unload the object ,overide this method,see bug 21587 protected void unloadObject(IRepositoryViewObject object) { }; public List<ERepositoryObjectType> getTypes() { return Arrays.asList((ERepositoryObjectType[]) ERepositoryObjectType.values()); } public final boolean isApplicableOnItems() { return true; } /** * Getter for project. * * @return the project */ public Project getProject() { return this.project; } /** * Sets the project. * * @param project the project to set */ public void setProject(Project project) { this.project = project; } public boolean isDeprecated() { return false; } public void setStatus(ExecutionResult status) { this.status = status; } public ExecutionResult getStatus() { return status; } }