// ============================================================================
//
// Copyright (C) 2006-2016 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.dq.writer.impl;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.talend.commons.emf.EMFUtil;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.cwm.dependencies.DependenciesHandler;
import org.talend.cwm.management.i18n.Messages;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.helpers.ReportHelper;
import org.talend.dataquality.properties.TDQAnalysisItem;
import org.talend.dataquality.properties.TDQReportItem;
import org.talend.dataquality.reports.AnalysisMap;
import org.talend.dataquality.reports.TdReport;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.ProxyRepositoryManager;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.AnalysisRepNode;
import org.talend.dq.writer.AElementPersistance;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.utils.sugars.ReturnCode;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.objectmodel.core.Dependency;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwmx.analysis.informationreporting.Report;
/**
* @author scorreia
*
* This class saves the analysis.
*/
public class ReportWriter extends AElementPersistance {
static Logger log = Logger.getLogger(ReportWriter.class);
/**
* DOC bZhou ReportWriter constructor comment.
*/
ReportWriter() {
super();
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.writer.AElementPersistance#addDependencies(orgomg.cwm.objectmodel.core.ModelElement)
*/
@Override
public void addDependencies(ModelElement element) {
TdReport report = (TdReport) element;
List<Analysis> analyses = ReportHelper.getAnalyses(report);
for (Analysis ana : analyses) {
// TDQ-7999,filter the proxy.
if (!ana.eIsProxy()) {
AnalysisRepNode recursiveFindAnalysis = RepositoryNodeHelper.recursiveFindAnalysis(ana);
// only do save when the dependency is not reference project node
if (recursiveFindAnalysis != null && recursiveFindAnalysis.getProject().isMainProject()) {
TypedReturnCode<Dependency> dependencyReturn = DependenciesHandler.getInstance().setDependencyOn(report, ana);
if (dependencyReturn.isOk()) {
try {
Property property = PropertyHelper.getProperty(ana);
if (property != null) {
Item item = property.getItem();
if (item instanceof TDQAnalysisItem) {
TDQAnalysisItem anaItem = (TDQAnalysisItem) item;
anaItem.setAnalysis(ana);
}
}
ProxyRepositoryFactory.getInstance().getRepositoryFactoryFromProvider().getResourceManager()
.saveResource(ana.eResource());
} catch (PersistenceException e) {
log.error(e, e);
}
}
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.writer.AElementPersistance#getFileExtension()
*/
@Override
protected String getFileExtension() {
return FactoriesUtil.REP;
}
@Override
public ReturnCode save(final Item item, final boolean careDependency) {
ReturnCode rc = new ReturnCode();
RepositoryWorkUnit<Object> repositoryWorkUnit = new RepositoryWorkUnit<Object>("save Report item") { //$NON-NLS-1$
@Override
protected void run() throws LoginException, PersistenceException {
TDQReportItem repItem = (TDQReportItem) item;
Report report = repItem.getReport();
// MOD yyi 2012-02-07 TDQ-4621:Update dependencies(connection) when careDependency is true.
if (careDependency) {
saveWithDependencies(repItem, report);
} else {
saveWithoutDependencies(repItem, report);
}
}
};
repositoryWorkUnit.setAvoidUnloadResources(true);
ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(repositoryWorkUnit);
try {
repositoryWorkUnit.throwPersistenceExceptionIfAny();
} catch (PersistenceException e) {
log.error(e, e);
rc.setOk(Boolean.FALSE);
rc.setMessage(e.getMessage());
}
return rc;
}
@Override
protected void notifyResourceChanges() {
ProxyRepositoryManager.getInstance().save();
}
/*
* (non-Javadoc)
*
* @see org.talend.dq.writer.AElementPersistance#removeDependencies(org.talend.core.model.properties.Item)
*/
@Override
protected ReturnCode removeDependencies(Item item) {
ReturnCode rc = new ReturnCode();
TDQReportItem anaItem = (TDQReportItem) item;
TdReport report = (TdReport) anaItem.getReport();
List<Property> clintDependency = DependenciesHandler.getInstance().getClintDependency(anaItem.getProperty());
EList<AnalysisMap> analysisMap = report.getAnalysisMap();
for (Property currentClient : clintDependency) {
ModelElement modelElement = PropertyHelper.getModelElement(currentClient);
if (!analysisMap.contains(modelElement)) {
boolean isSuccess = DependenciesHandler.getInstance().removeDependenciesBetweenModel(report, modelElement);
if (isSuccess) {
rc.setOk(EMFUtil.saveSingleResource(modelElement.eResource()));
} else {
rc.setOk(false);
rc.setMessage(Messages.getString("ReportWriter.CanNotFindDependencyElement", report.getName(), //$NON-NLS-1$
modelElement.getName()));
}
}
}
return rc;
}
}