// ============================================================================
//
// 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.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.commons.emf.EmfHelper;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.model.migration.AbstractItemMigrationTask;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.XmiResourceManager;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.URIHelper;
/**
* DOC nrousseau class global comment. Detailled comment
*/
public class FixProjectResourceLink extends AbstractItemMigrationTask {
@Override
public ExecutionResult execute(Item item) {
if (item.getProperty().getAuthor() == null) {
// this case shouldn't happen normally, but just in case, each item should have one author
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
item.getProperty().setAuthor(factory.getRepositoryContext().getUser());
}
if (ERepositoryObjectType.getItemType(item).isDQItemType() && !ERepositoryObjectType.getItemType(item).isDIItemType()) {
return ExecutionResult.NOTHING_TO_DO;
}
if (item.getProperty().getAuthor().getLogin() != null) {
return ExecutionResult.NOTHING_TO_DO;
}
// if go here, it means property got wrong link to the project.
// (like for example item look for: ../../../talend.project, but it should be: ../../talend.project)
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
item.getProperty().setAuthor(factory.getRepositoryContext().getUser());
// now we should remove wrong URI from resource manager.
// if this bug above happen, means the resourceSet keep wrong link to the project
XmiResourceManager manager = ProxyRepositoryFactory.getInstance().getRepositoryFactoryFromProvider().getResourceManager();
List<Resource> toDelete = new ArrayList<Resource>();
for (Resource resource : manager.resourceSet.getResources()) {
if (resource.getURI().toString().contains(manager.getProjectFilename())) {
try {
IFile file = URIHelper.getFile(resource.getURI());
if (!file.exists()) {
toDelete.add(resource);
}
} catch (Exception e) {
toDelete.add(resource);
}
}
}
EmfHelper.visitChilds(item);
try {
factory.save(item, true);
} catch (PersistenceException e) {
ExceptionHandler.process(e);
} catch (UnsupportedOperationException e1) {
ExceptionHandler.process(e1);
}
manager.resourceSet.getResources().removeAll(toDelete);
return ExecutionResult.SUCCESS_NO_ALERT;
}
public Date getOrder() {
GregorianCalendar gc = new GregorianCalendar(2010, 12, 20, 12, 0, 0);
return gc.getTime();
}
}