// ============================================================================
//
// 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.dataprofiler.core.ui.action.actions.handle;
import java.io.File;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.utils.WorkspaceUtils;
import org.talend.commons.utils.io.FilesUtils;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.cwm.helper.TaggedValueHelper;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.migration.impl.UpdateUDIIndicatorsWithNewModelTask;
import org.talend.dataprofiler.core.ui.utils.UDIUtils;
import org.talend.dataquality.helpers.IndicatorCategoryHelper;
import org.talend.dataquality.indicators.definition.IndicatorCategory;
import org.talend.dataquality.indicators.definition.IndicatorDefinition;
import org.talend.dataquality.indicators.definition.userdefine.UDIndicatorDefinition;
import org.talend.dataquality.properties.TDQIndicatorDefinitionItem;
import org.talend.dq.helper.UDIHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.resource.ResourceManager;
import org.talend.resource.ResourceService;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* Duplicate an indicator definition
*/
public class IndicatorDuplicateHandle extends ModelElementDuplicateHandle {
private Logger log = Logger.getLogger(IndicatorDuplicateHandle.class);
private boolean isUserDefCategory = Boolean.FALSE;
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.action.actions.handle.ModelElementDuplicateHandle#extractFolder(org.talend.core
* .model.properties.Item, orgomg.cwm.objectmodel.core.ModelElement)
*/
@Override
protected IFolder extractFolder(Item oldItem, ModelElement oldObject) {
return ResourceManager.getUDIFolder();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.action.actions.handle.EMFResourceHandle#duplicate(java.lang.String)
*/
@Override
public ModelElement duplicateModelElement(ModelElement oldModelElement, String newName) {
ModelElement duplicateModelElement = super.duplicateModelElement(oldModelElement, newName);
IndicatorDefinition definition = (IndicatorDefinition) duplicateModelElement;
// MOD klliu 2010-09-25 bug 15530 when duplicate the system indicator ,the definition must be reset the
// category and the label name
isUserDefCategory = IndicatorCategoryHelper.isUserDefCategory(UDIHelper.getUDICategory(definition));
if (!isUserDefCategory) {
updateCategory(duplicateModelElement, definition);
}
TaggedValueHelper.setValidStatus(true, definition);
definition.setLabel(definition.getName());
return definition;
}
@Override
public Item duplicateItem(Item oldItem, String newName) throws BusinessException {
Item duplicateItem = super.duplicateItem(oldItem, newName);
// reload is needed after duplicate an indicator.
DefinitionHandler.getInstance().reloadIndicatorsDefinitions();
// update the udi model to new model, after have created the indicator definition item
if (!isUserDefCategory) {
updateUDIModel(newName, ((TDQIndicatorDefinitionItem) duplicateItem).getIndicatorDefinition());
}
return duplicateItem;
}
private void updateUDIModel(String newName, ModelElement duplicateModelElement) {
URI uri = duplicateModelElement.eResource().getURI();
IFile file = ResourceManager.getRoot().getFile(new Path(uri.toPlatformString(false)));
File ifileToFile = WorkspaceUtils.ifileToFile(file);
Map<String, String> initIndicatorReplaceMap = UpdateUDIIndicatorsWithNewModelTask.initIndicatorReplaceMap();
if (FilesUtils.migrateFile(ifileToFile, initIndicatorReplaceMap, log)) {
try {
for (IRepositoryViewObject viewObject : ProxyRepositoryFactory.getInstance().getAll(
ERepositoryObjectType.TDQ_USERDEFINE_INDICATORS)) {
ProxyRepositoryFactory.getInstance().reload(viewObject.getProperty());
}
} catch (PersistenceException e) {
log.error(e);
}
ResourceService.refreshStructure();
// add templates for udi only.
List<IndicatorDefinition> indiDefinitions = DefinitionHandler.getInstance().getUserDefinedIndicatorDefinitions();
for (IndicatorDefinition indiDefinition : indiDefinitions) {
if (indiDefinition instanceof UDIndicatorDefinition) {
String name = indiDefinition.getLabel() != null ? indiDefinition.getLabel() : indiDefinition.getName();
if (name != null && name.equals(newName)) {
UDIndicatorDefinition udi = (UDIndicatorDefinition) indiDefinition;
udi = UDIUtils.createDefaultDrillDownList(udi);
ElementWriterFactory.getInstance().createIndicatorDefinitionWriter().save(udi);
break;
}
}
}
}
}
private void updateCategory(ModelElement duplicateModelElement, IndicatorDefinition definition) {
IndicatorCategory category = null;
String indDefUuid = ResourceHelper.getUUID(duplicateModelElement);
if (PluginConstant.PATTERN_FREQUENCY_TABLE_ID.equals(indDefUuid)
|| PluginConstant.DATE_PATTERN_FREQUENCY_TABLE_ID.equals(indDefUuid)
|| PluginConstant.PATTERN_LOW_FREQUENCY_TABLE_ID.equals(indDefUuid)) {
category = DefinitionHandler.getInstance().getUserDefinedFrequencyIndicatorCategory();
} else {
category = DefinitionHandler.getInstance().getUserDefinedCountIndicatorCategory();
}
if (category != null) {
UDIHelper.setUDICategory(definition, category);
}
}
}