// ============================================================================
//
// 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.mdm.repository.ui.wizards.exports;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.models.FolderRepositoryObject;
import org.talend.mdm.repository.ui.wizards.exports.viewers.ExportRepObjCheckTreeViewer;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.repository.local.ExportItemUtil;
import com.amalto.workbench.export.ExportItemsWizard;
/**
* DOC hywang class global comment. this wizard is used to export the selected items from MDMRepositoryView
*/
public class MDMExportRepositoryItemsWizard extends ExportItemsWizard {
ExportRepObjCheckTreeViewer checkTreeViewer;
private static Log log = LogFactory.getLog(MDMExportRepositoryItemsWizard.class);
public MDMExportRepositoryItemsWizard(IStructuredSelection sel) {
super(sel);
}
// create a check box viewer
@Override
protected void createViewer() {
checkTreeViewer = new ExportRepObjCheckTreeViewer(sel);
}
// do export is need to override ,use the system of TOS to export EMF files
@Override
public void doexport(Object[] selectedNodes, IProgressMonitor monitor) {
List<IRepositoryViewObject> objs = new LinkedList<IRepositoryViewObject>();
for (Object obj : selectedNodes) {
if (obj instanceof IRepositoryViewObject) {
objs.add((IRepositoryViewObject) obj);
}
}
if (exportFolder != null) {
Collection<Item> selectedItems = getItemsToExport(objs);
try {
ExportItemUtil exportItemUtil = new ExportItemUtil();
// MOD sgandon 31/03/2010 bug 12229: moved getAllVersion into ExportItemUtil.exportitems() method.
exportItemUtil.exportItems(new File(exportFolder), selectedItems, true, monitor);
} catch (Exception e) {
MessageBoxExceptionHandler.process(e);
}
}
}
@Override
protected Object[] getCheckedObjects() {
return checkTreeViewer.getCheckNodes();
}
/**
* DOC hywang Comment method "getItemsToExport".
*
*/
private Collection<Item> getItemsToExport(Collection<IRepositoryViewObject> objs) {
List<Item> toReturn = null;
if (objs != null && objs.size() > 0) {
toReturn = new ArrayList<Item>();
for (IRepositoryViewObject obj : objs) {
Item item = obj.getProperty().getItem();
if (item != null && !(item instanceof ContainerItem)) {
item = RepositoryResourceUtil.assertItem(item);
toReturn.add(item);
}
}
}
return toReturn;
}
@Override
protected Composite initItemTreeViewer(Composite composite) {
Composite returnComposite = checkTreeViewer.createItemList(composite);
checkTreeViewer.setItemText(Messages.MDMExportRepositoryItemsWizard_exportItem);
initCheckState();
return returnComposite;
}
private void initCheckState() {
CheckboxTreeViewer tv = (CheckboxTreeViewer) checkTreeViewer.getViewer();
tv.expandAll();
List<IRepositoryViewObject> leafItems = new ArrayList<IRepositoryViewObject>();
getCheckedViewObjects(sel, leafItems, new ArrayList<IRepositoryViewObject>());
recursiveExpand(tv.getTree().getItems(), leafItems);
((CheckboxTreeViewer) checkTreeViewer.getViewer()).setCheckedElements(leafItems.toArray());
checkTreeViewer.updateCountStatus();
}
private boolean recursiveExpand(TreeItem[] items, List<IRepositoryViewObject> leafItems) {
boolean expanda = false;
for (TreeItem item : items) {
IRepositoryViewObject viewObj = (IRepositoryViewObject) item.getData();
if (leafItems.contains(viewObj)) {
expanda = true;
break;
}
if (viewObj instanceof FolderRepositoryObject) {
boolean expand = recursiveExpand(item.getItems(), leafItems);
item.setExpanded(expand);
if (expand) {
expanda = true;
}
}
}
return expanda;
}
private void getCheckedViewObjects(IStructuredSelection sel, List<IRepositoryViewObject> leafItems,
List<IRepositoryViewObject> noneLeafItems) {
Map<String, List<IRepositoryViewObject>> viewObjTypeMap = new TreeMap<String, List<IRepositoryViewObject>>();
Map<String, List<String>> pathMap = new HashMap<String, List<String>>();
Map<String, ERepositoryObjectType> types = new HashMap<String, ERepositoryObjectType>();
List<IRepositoryViewObject> seList = sel.toList();
for (IRepositoryViewObject iRepositoryViewObject : seList) {
IRepositoryViewObject viewObj = iRepositoryViewObject;
ERepositoryObjectType repositoryObjectType = viewObj.getRepositoryObjectType();
if (repositoryObjectType != null) {
List<IRepositoryViewObject> list = viewObjTypeMap.get(repositoryObjectType.name());
List<String> typePaths = pathMap.get(repositoryObjectType.name());
if (list == null) {
list = new LinkedList<IRepositoryViewObject>();
viewObjTypeMap.put(repositoryObjectType.name(), list);
typePaths = new LinkedList<String>();
pathMap.put(repositoryObjectType.name(), typePaths);
types.put(repositoryObjectType.name(), repositoryObjectType);
}
list.add(viewObj);
typePaths.add(viewObj.getPath());
}
}
List<IRepositoryViewObject> childs = new LinkedList<IRepositoryViewObject>();
for (String etype : types.keySet()) {
List<IRepositoryViewObject> viewObjectsWithDeleted = getAllViewObjectByType(types.get(etype));
for (IRepositoryViewObject vObject : viewObjectsWithDeleted) {
List<String> pathList = pathMap.get(etype);
for (int i = 0; i < pathList.size(); i++) {
if (vObject.getPath().equals(pathList.get(i))) {
IRepositoryViewObject vo = viewObjTypeMap.get(etype).get(i);
if (vo instanceof FolderRepositoryObject && !(vObject instanceof FolderRepositoryObject)) {
childs.add(vObject);
break;
}
} else if (vObject.getPath().contains(pathList.get(i))
&& viewObjTypeMap.get(etype).get(i) instanceof FolderRepositoryObject) {
childs.add(vObject);
break;
}
}
}
}
childs.addAll(seList);
for (int i = 0; i < childs.size(); i++) {
if (childs.get(i) instanceof FolderRepositoryObject) {
noneLeafItems.add(childs.get(i));
} else {
leafItems.add(childs.get(i));
}
}
}
private List<IRepositoryViewObject> getAllViewObjectByType(ERepositoryObjectType eType) {
List<IRepositoryViewObject> viewObjectsWithDeleted = null;
if (eType == IServerObjectRepositoryType.TYPE_EVENTMANAGER) {
viewObjectsWithDeleted = new LinkedList<IRepositoryViewObject>();
List<IRepositoryViewObject> aViewObjects = RepositoryResourceUtil
.findAllViewObjects(IServerObjectRepositoryType.TYPE_TRANSFORMERV2);
List<IRepositoryViewObject> bViewObjects = RepositoryResourceUtil
.findAllViewObjects(IServerObjectRepositoryType.TYPE_ROUTINGRULE);
viewObjectsWithDeleted.addAll(aViewObjects);
viewObjectsWithDeleted.addAll(bViewObjects);
} else {
viewObjectsWithDeleted = RepositoryResourceUtil.findAllViewObjectsWithDeleted(eType);
}
return viewObjectsWithDeleted;
}
}