// ============================================================================
//
// 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.views.provider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.Folder;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.AbstractEMFRepositoryFactory;
import org.talend.core.repository.model.FolderHelper;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.dataprofiler.core.ui.exchange.ExchangeFolderRepNode;
import org.talend.dataprofiler.core.ui.utils.HadoopClusterUtils;
import org.talend.dataquality.indicators.definition.IndicatorCategory;
import org.talend.dataquality.indicators.definition.IndicatorDefinition;
import org.talend.dq.analysis.category.CategoryHandler;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.AnalysisFolderRepNode;
import org.talend.dq.nodes.DBConnectionFolderRepNode;
import org.talend.dq.nodes.DFConnectionFolderRepNode;
import org.talend.dq.nodes.DQRepositoryNode;
import org.talend.dq.nodes.IndicatorFolderRepNode;
import org.talend.dq.nodes.JrxmlTempFolderRepNode;
import org.talend.dq.nodes.PatternFolderRepNode;
import org.talend.dq.nodes.ReportFolderRepNode;
import org.talend.dq.nodes.RulesFolderRepNode;
import org.talend.dq.nodes.SourceFileFolderRepNode;
import org.talend.dq.nodes.hadoopcluster.HadoopClusterFolderRepNode;
import org.talend.repository.ProjectManager;
import org.talend.repository.localprovider.model.LocalFolderHelper;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.RepositoryNode;
import org.talend.resource.EResourceConstant;
/**
* DOC klliu class global comment. Detailled comment
*/
public final class RepositoryNodeBuilder {
private static RepositoryNodeBuilder instance;
/**
* DOC klliu RepositoryNodeBuilder constructor comment.
*/
public RepositoryNodeBuilder() {
}
/**
* DOC klliu Comment method "retrieveRepObjectType".
*
* @param path
* @return
*/
public ERepositoryObjectType retrieveRepObjectTypeByPath(String path) {
return RepositoryNodeHelper.retrieveRepObjectTypeByPath(path);
}
/**
* get parent path
*
* @param path relative path to current project
* @return if path is empty will return {@link Path#EMPTY}
*/
private String getParentPath(String path) {
if (path == null) {
return Path.EMPTY.toOSString();
}
IPath removeLastSegments = new Path(path).removeLastSegments(1);
return removeLastSegments.toString();
}
/**
* DOC klliu Comment method "createSystemFolder".
*
* @param node
* @param resConstant
* @return
* @throws PersistenceException
* @deprecated instead of it ues {@link #createRepositoryNodeSubSystemFolder(RepositoryNode, EResourceConstant)}
*/
@Deprecated
public RepositoryNode createRepositoryNodeSystemFolder(FolderHelper folderHelper, RepositoryNode node,
EResourceConstant resConstant) throws PersistenceException {
IRepositoryViewObject folder = null;
if (folderHelper != null) {
FolderItem folder2 = folderHelper.getFolder(resConstant.getPath());
folder = new Folder(folder2.getProperty(), retrieveRepObjectTypeByPath(resConstant.getPath()));
} else {
folder = ProxyRepositoryFactory.getInstance().createFolder(retrieveRepObjectTypeByPath(resConstant.getPath()),
Path.EMPTY, resConstant.getName());
}
return createRepositoryNode(folder, node, resConstant, null);
}
/**
* create repository node for sub system folder
*
* @param node create repository node
* @param resConstant sub folder type
* @return sub node
* @throws PersistenceException
*/
public RepositoryNode createRepositoryNodeSubSystemFolder(RepositoryNode node, EResourceConstant resConstant)
throws PersistenceException {
Project currentProject = ProjectManager.getInstance().getCurrentProject();
return createRepositoryNodeSubSystemFolder(node, resConstant, currentProject);
}
/**
* create repository node for sub system folder
*
* @param node create repository node
* @param resConstant sub folder type
* @return sub node
* @throws PersistenceException
*/
public RepositoryNode createRepositoryNodeSubSystemFolder(RepositoryNode node, EResourceConstant resConstant,
org.talend.core.model.general.Project currentProject) throws PersistenceException {
IRepositoryViewObject folder = null;
ERepositoryObjectType repositoryObjectType = retrieveRepObjectTypeByPath(resConstant.getPath());
FolderItem folderItem = ProxyRepositoryFactory.getInstance().getFolderItem(currentProject, repositoryObjectType,
Path.EMPTY);
if (folderItem != null) {
folder = new Folder(folderItem.getProperty(), repositoryObjectType);
} else {
folder = ProxyRepositoryFactory.getInstance().createFolder(
retrieveRepObjectTypeByPath(getParentPath(resConstant.getPath())), Path.EMPTY, resConstant.getName());
}
return createRepositoryNode(folder, node, resConstant, currentProject);
}
private RepositoryNode createRepositoryNode(IRepositoryViewObject folder, RepositoryNode parentNode,
EResourceConstant resConstant, org.talend.core.model.general.Project inWhichProject) throws PersistenceException {
DQRepositoryNode subFolderNode = null;
switch (resConstant) {
case ANALYSIS:
AnalysisFolderRepNode anaFolderNode = new AnalysisFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(anaFolderNode);
parentNode.getChildren().add(anaFolderNode);
return anaFolderNode;
case REPORTS:
ReportFolderRepNode repFolderNode = new ReportFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(repFolderNode);
parentNode.getChildren().add(repFolderNode);
return repFolderNode;
case INDICATORS:
IndicatorFolderRepNode indicatorFolderRepNode = new IndicatorFolderRepNode(folder, parentNode,
ENodeType.SYSTEM_FOLDER, inWhichProject);
folder.setRepositoryNode(indicatorFolderRepNode);
parentNode.getChildren().add(indicatorFolderRepNode);
return indicatorFolderRepNode;
case JRXML_TEMPLATE:
JrxmlTempFolderRepNode jrxmlFolderNode = new JrxmlTempFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(jrxmlFolderNode);
parentNode.getChildren().add(jrxmlFolderNode);
return jrxmlFolderNode;
case SOURCE_FILES:
SourceFileFolderRepNode sourceFileFolder = new SourceFileFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(sourceFileFolder);
parentNode.getChildren().add(sourceFileFolder);
return sourceFileFolder;
case PATTERNS:
PatternFolderRepNode patternFolder = new PatternFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(patternFolder);
parentNode.getChildren().add(patternFolder);
return patternFolder;
case RULES:
RulesFolderRepNode ruleFolder = new RulesFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER, inWhichProject);
folder.setRepositoryNode(ruleFolder);
parentNode.getChildren().add(ruleFolder);
return ruleFolder;
case DB_CONNECTIONS:
DBConnectionFolderRepNode dbFolder = new DBConnectionFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(dbFolder);
parentNode.getChildren().add(dbFolder);
return dbFolder;
case FILEDELIMITED:
DFConnectionFolderRepNode dfmFolder = new DFConnectionFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(dfmFolder);
parentNode.getChildren().add(dfmFolder);
return dfmFolder;
case HADOOP_CLUSTER:
if (HadoopClusterUtils.getDefault().isServiceInstalled()) {
HadoopClusterFolderRepNode hcFolder = new HadoopClusterFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(hcFolder);
parentNode.getChildren().add(hcFolder);
return hcFolder;
}
case EXCHANGE:
ExchangeFolderRepNode exchangeFolder = new ExchangeFolderRepNode(folder, parentNode, ENodeType.SYSTEM_FOLDER,
inWhichProject);
folder.setRepositoryNode(exchangeFolder);
parentNode.getChildren().add(exchangeFolder);
return exchangeFolder;
// case REFERENCED_PROJECT:
default:
subFolderNode = new DQRepositoryNode(folder, parentNode, ENodeType.SYSTEM_FOLDER, inWhichProject);
folder.setRepositoryNode(subFolderNode);
parentNode.getChildren().add(subFolderNode);
if (resConstant.equals(EResourceConstant.PATTERNS)) {
// MOD gdbu 2011-8-26 bug 23303 : initialization regex and sql folder when initialization pattern folder
createRepositoryNodeSubSystemFolder(subFolderNode, EResourceConstant.PATTERN_REGEX, inWhichProject);
createRepositoryNodeSubSystemFolder(subFolderNode, EResourceConstant.PATTERN_SQL, inWhichProject);
}
break;
}
return subFolderNode;
}
/**
* DOC klliu Comment method "createRepositoryNodeSystemFolders".
*
* @param node
* @param resConstants
* @return
* @throws PersistenceException
* @deprecated use {@link #createRepositoryNodeSystemFolders(RepositoryNode, List)} instead
*/
@Deprecated
public List<RepositoryNode> createRepositoryNodeSystemFolders(FolderHelper folderHelper, RepositoryNode node,
List<EResourceConstant> resConstants) throws PersistenceException {
List<RepositoryNode> repositoryNodes = new ArrayList<RepositoryNode>();
for (EResourceConstant resConstant : resConstants) {
repositoryNodes.add(createRepositoryNodeSystemFolder(folderHelper, node, resConstant));
}
return repositoryNodes;
}
/**
* create repository node for a system folder
*
* @param node
* @param resConstants
* @return sub node list
* @throws PersistenceException
*/
public List<RepositoryNode> createRepositoryNodeSystemFolders(RepositoryNode node, List<EResourceConstant> resConstants)
throws PersistenceException {
List<RepositoryNode> repositoryNodes = new ArrayList<RepositoryNode>();
for (EResourceConstant resConstant : resConstants) {
repositoryNodes.add(createRepositoryNodeSubSystemFolder(node, resConstant));
}
return repositoryNodes;
}
/**
* create repository node for a system folder
*
* @param node
* @param resConstants
* @return sub node list
* @throws PersistenceException
*/
public List<RepositoryNode> createRepositoryNodeSystemFolders(RepositoryNode node, List<EResourceConstant> resConstants,
org.talend.core.model.general.Project currentProject) throws PersistenceException {
List<RepositoryNode> repositoryNodes = new ArrayList<RepositoryNode>();
for (EResourceConstant resConstant : resConstants) {
repositoryNodes.add(createRepositoryNodeSubSystemFolder(node, resConstant, currentProject));
}
return repositoryNodes;
}
/**
* DOC klliu Comment method "getIndicatorsChildren".
*
* @param conList
* @return
*/
public Collection<? extends IRepositoryNode> getIndicatorsChildren(List<IRepositoryViewObject> conList) {
List<IRepositoryNode> list = new ArrayList<IRepositoryNode>();
Iterator<IRepositoryViewObject> iterator = conList.iterator();
while (iterator.hasNext()) {
IRepositoryViewObject indicatorFolder = iterator.next();
list.add(new RepositoryNode(indicatorFolder, null, ENodeType.SYSTEM_FOLDER));
}
return list;
}
/**
*
* create a Local folder Helper
*
* @return Local Folder helper
*
* @deprecated use {@link AbstractEMFRepositoryFactory#getFolderHelper()} instead.
*/
@Deprecated
public FolderHelper getFolderHelper() {
RepositoryContext repositoryContext = (RepositoryContext) CoreRuntimePlugin.getInstance().getContext()
.getProperty(Context.REPOSITORY_CONTEXT_KEY);
Project project = null;
FolderHelper folderHelper = null;
if (repositoryContext != null) {
project = repositoryContext.getProject();
if (project != null) {
folderHelper = LocalFolderHelper.createInstance(project.getEmfProject(), repositoryContext.getUser());
}
}
return folderHelper;
}
/**
* DOC xqliu Comment method "getIndicatorsChildren".
*
* @param category
* @return
*/
public Object[] getIndicatorsChildren(IndicatorCategory category) {
List<IndicatorDefinition> indicatorDefinitionList = CategoryHandler.getIndicatorDefinitionList(category);
if (indicatorDefinitionList == null) {
indicatorDefinitionList = new ArrayList<IndicatorDefinition>();
}
return indicatorDefinitionList.toArray();
}
/**
* DOC xqliu Comment method "getIndicatorChildren".
*
* @return
*/
public Object[] getIndicatorsChildren(IFolder folder) {
List<Object> list = new ArrayList<Object>();
// MOD mzhao feature 13676, split system indicators. 2010-07-08
// list.add(new IndicatorFolderNode("System"));
try {
list.addAll(Arrays.asList(folder.members()));
} catch (CoreException e) {
e.printStackTrace();
}
return list.toArray();
}
/**
* DOC klliu Comment method "getInstance".
*
* @return
*/
public static RepositoryNodeBuilder getInstance() {
if (instance == null) {
instance = new RepositoryNodeBuilder();
}
return instance;
}
public Folder getObjectFolder(EResourceConstant resConstant) {
Project currentProject = ProjectManager.getInstance().getCurrentProject();
ERepositoryObjectType repositoryObjectType = retrieveRepObjectTypeByPath(resConstant.getPath());
FolderItem folderItem = ProxyRepositoryFactory.getInstance().getFolderItem(currentProject, repositoryObjectType,
Path.EMPTY);
Folder folder = new Folder(folderItem.getProperty(), retrieveRepObjectTypeByPath(resConstant.getPath()));
return folder;
}
}