org.talend.repository.model.RepositoryNodeUtilities.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.repository.model.RepositoryNodeUtilities.java

Source

// ============================================================================
//
// 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.repository.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.gmf.util.DisplayUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.PluginChecker;
import org.talend.core.hadoop.IHadoopClusterService;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.FolderType;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.RoutineItem;
import org.talend.core.model.properties.SAPConnectionItem;
import org.talend.core.model.relationship.Relation;
import org.talend.core.model.relationship.RelationshipItemBuilder;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.utils.RepositoryManagerHelper;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.core.runtime.i18n.Messages;
import org.talend.core.runtime.services.IGenericWizardService;
import org.talend.core.ui.ITestContainerProviderService;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.nodes.IProjectRepositoryNode;
import org.talend.repository.ui.views.IRepositoryView;

/**
 * Utility class to manage RepositoryNode.<br/>
 * 
 * $Id: RepositoryNodeUtilities.java 1368 2007-01-10 09:50:53Z smallet $
 * 
 */
public class RepositoryNodeUtilities {

    private static IHadoopClusterService hadoopClusterService = null;
    static {
        if (GlobalServiceRegister.getDefault().isServiceRegistered(IHadoopClusterService.class)) {
            hadoopClusterService = (IHadoopClusterService) GlobalServiceRegister.getDefault()
                    .getService(IHadoopClusterService.class);
        }
    }

    public static IPath getPath(final IRepositoryNode node) {
        if (node == null) {
            return null;
        }
        if (node.isBin()) {
            return new Path(""); //$NON-NLS-1$
        }
        if ((node.getType() == ENodeType.STABLE_SYSTEM_FOLDER
                && node.getContentType() != ERepositoryObjectType.JOB_DOC
                && node.getContentType() != ERepositoryObjectType.JOBLET_DOC)
                || node.getType() == ENodeType.SYSTEM_FOLDER) {
            return new Path(""); //$NON-NLS-1$
        }
        if (node.getType() == ENodeType.SIMPLE_FOLDER) {
            String label = node.getObject().getProperty().getLabel();
            return getPath(node.getParent()).append(label);
        }

        String label = node.getLabel();
        // checks if node is under Documentations/Generatated/Jobs
        if (node.getType() == ENodeType.STABLE_SYSTEM_FOLDER
                && (node.getContentType() == ERepositoryObjectType.JOB_DOC
                        || node.getContentType() == ERepositoryObjectType.JOBLET_DOC)) {

            Object nodeLabel = node.getProperties(EProperties.LABEL);

            if (nodeLabel == ERepositoryObjectType.JOB_DOC) {
                return new Path(""); //$NON-NLS-1$
            } else {
                return getPath(node.getParent()).append(label);
            }
        } else {
            if (/* !isMetadataLabel(label) && */node.getType() != ENodeType.REPOSITORY_ELEMENT) {
                return getPath(node.getParent()).append(label);
            } else {
                return getPath(node.getParent());
            }
        }

    }

    public static IPath getFolderPath(EObject obj) {
        if (obj == null) {
            return null;
        }
        if (!(obj instanceof FolderItem)) {
            return new Path("");
        }
        FolderItem folderItem = (FolderItem) obj;

        if (folderItem.getType().getValue() == FolderType.FOLDER) {
            String label = folderItem.getProperty().getLabel();
            return getFolderPath(folderItem.getParent()).append(label);
        }
        return new Path("");

    }

    public static IRepositoryView getRepositoryView() {
        return RepositoryManagerHelper.getRepositoryView();
    }

    // /**
    // * Gather all view's metadata children nodes dynamic and get their label.
    // * <p>
    // * DOC YeXiaowei Comment method "isMetadataLabel".
    // *
    // * @param label
    // * @return
    // */
    // private static boolean isMetadataLabel(final String label) {
    //
    // if (!PluginChecker.isOnlyTopLoaded() && !CoreRuntimePlugin.getInstance().isDataProfilePerspectiveSelected()) {
    // IRepositoryView view = getRepositoryView();
    // if (view == null) {
    // return false;
    // }
    //
    // String[] metadataLabels = view.gatherMetadataChildenLabels();
    // if (metadataLabels == null || metadataLabels.length <= 0) {
    // return false;
    // }
    //
    // for (String mlabel : metadataLabels) {
    // if (mlabel.equals(label)) {
    // return true;
    // }
    // }
    // }
    //
    // return false;
    //
    // }

    /**
     * 
     * ggu Comment method "getPath".
     * 
     * get path by repository item id. can't get the folders.
     */
    public static IPath getPath(final String id) {
        if (id == null || "".equals(id) || RepositoryNode.NO_ID.equals(id)) { //$NON-NLS-1$
            return null;
        }
        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        try {
            final IRepositoryViewObject lastVersion = factory.getLastVersion(id);
            return getPath(lastVersion);
        } catch (PersistenceException e) {
            //
        }
        return null;
    }

    public static IPath getPath(IRepositoryViewObject curNode) {
        if (curNode == null) {
            return null;
        }
        final RepositoryNode repositoryNode = getRepositoryNode(curNode);
        if (repositoryNode != null) {
            return getPath(repositoryNode);
        }
        return null;
    }

    /**
     * 
     * ggu Comment method "getRepositoryNode".
     * 
     * @param id
     * @return the repository node by id
     * @see RepositorySeekerManager.searchRepoViewNode
     * @deprecated
     */
    @Deprecated
    public static RepositoryNode getRepositoryNode(final String id) {
        return getRepositoryNode(id, true);
    }

    /**
     * @see RepositorySeekerManager.searchRepoViewNode
     * @deprecated
     */
    @Deprecated
    public static RepositoryNode getRepositoryNode(final String id, boolean expanded) {
        if (id == null || "".equals(id) || RepositoryNode.NO_ID.equals(id)) { //$NON-NLS-1$
            return null;
        }
        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        try {
            final IRepositoryViewObject lastVersion = factory.getLastVersion(id);
            if (lastVersion != null) {
                return getRepositoryNode(lastVersion, expanded);
            }
        } catch (PersistenceException e) {
            //
        }
        return null;
    }

    /**
     * 
     * ggu Comment method "getRepositoryNode".
     * 
     * get the repository node by a IRepositoryObject.
     */
    public static RepositoryNode getRepositoryNode(IRepositoryViewObject curNode) {
        return getRepositoryNode(curNode, true);
    }

    public static RepositoryNode getRepositoryNode(IRepositoryViewObject curNode, boolean expanded) {
        if (curNode == null) {
            return null;
        }
        IRepositoryView view = getRepositoryView();
        if (view == null) {
            return null;
        }
        return getRepositoryNode((IRepositoryNode) view.getRoot(), curNode, view, expanded);
    }

    private static IRepositoryNode viewRootNode;

    public static RepositoryNode getRepositoryNode(IRepositoryViewObject curNode, IProgressMonitor monitor) {
        if (curNode == null) {
            return null;
        }
        viewRootNode = null;
        DisplayUtils.getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                IRepositoryView view = getRepositoryView();
                if (view != null) {
                    viewRootNode = (IRepositoryNode) view.getRoot();
                }
            }
        });
        if (viewRootNode == null) {
            return null;
        }
        RepositoryNode toReturn = getRepositoryNode(viewRootNode, curNode, monitor);

        // try to find the node from the root type of node.
        if (toReturn == null && viewRootNode instanceof IProjectRepositoryNode) {
            IRepositoryNode typeNode = ((IProjectRepositoryNode) viewRootNode)
                    .getRootRepositoryNode(curNode.getRepositoryObjectType());
            toReturn = getRepositoryNode(typeNode, curNode, monitor);
        }
        viewRootNode = null;

        return toReturn;
    }

    private static RepositoryNode getRepositoryNode(IRepositoryNode rootNode, IRepositoryViewObject curNode,
            IProgressMonitor monitor) {
        if (rootNode == null || curNode == null) {
            return null;
        }
        if (monitor != null && monitor.isCanceled()) {
            return null;
        }

        List<IRepositoryNode> children = rootNode.getChildren();

        if (children != null) {
            if (children.isEmpty()) {
                rootNode.getRoot().initNode(rootNode);
                children = rootNode.getChildren();
            }
            // in the first, search the current folder
            List<IRepositoryNode> folderChild = new ArrayList<IRepositoryNode>();

            for (IRepositoryNode childNode : children) {
                RepositoryNode node = (RepositoryNode) childNode;
                if (isRepositoryFolder(node) || node.getType() == ENodeType.REFERENCED_PROJECT) {
                    folderChild.add(node);
                } else if (hadoopClusterService != null && hadoopClusterService.isHadoopClusterNode(node)) {
                    if (node.getId().equals(curNode.getId())
                            && node.getObjectType() == curNode.getRepositoryObjectType()) {
                        return node;
                    } else {
                        folderChild.add(node);
                    }
                } else if (node.getId().equals(curNode.getId())
                        && node.getObjectType() == curNode.getRepositoryObjectType()) {
                    return node;
                }

            }
            for (IRepositoryNode folderNode : folderChild) {
                final RepositoryNode repositoryNode = getRepositoryNode(folderNode, curNode, monitor);
                if (repositoryNode != null) {
                    return repositoryNode;
                }
            }
        }

        return null;
    }

    private static RepositoryNode getRepositoryNode(IRepositoryNode rootNode, IRepositoryViewObject curNode,
            IRepositoryView view, boolean expanded) {
        if (rootNode == null || curNode == null || view == null) {
            return null;
        }
        if (expanded) {
            // expande the unvisible node
            expandNode((RepositoryNode) rootNode, curNode, view);
        }

        final List<IRepositoryNode> children = rootNode.getChildren();

        if (children != null) {
            // in the first, search the current folder
            List<IRepositoryNode> folderChild = new ArrayList<IRepositoryNode>();
            List<IRepositoryNode> testCaseFather = new ArrayList<IRepositoryNode>();
            for (IRepositoryNode childNode : children) {
                RepositoryNode node = (RepositoryNode) childNode;
                if (isRepositoryFolder(node) || node.getType() == ENodeType.REFERENCED_PROJECT) {
                    folderChild.add(node);
                } else if (isHadoopClusterNode(node)) {
                    if (node.getId().equals(curNode.getId())
                            && node.getObjectType() == curNode.getRepositoryObjectType()) {
                        return node;
                    } else {
                        folderChild.add(node);
                    }
                } else if (node.getId().equals(curNode.getId())
                        && node.getObjectType() == curNode.getRepositoryObjectType()) {
                    return node;
                } else {
                    if (GlobalServiceRegister.getDefault()
                            .isServiceRegistered(ITestContainerProviderService.class)) {
                        ITestContainerProviderService testContainerService = (ITestContainerProviderService) GlobalServiceRegister
                                .getDefault().getService(ITestContainerProviderService.class);
                        if (testContainerService != null) {
                            String originalID = testContainerService.getOriginalID(curNode);
                            if (originalID != null && node.getId().equals(originalID)) {
                                testCaseFather.add(node);
                            }
                        }
                    }
                }
            }
            for (IRepositoryNode folderNode : folderChild) {
                final RepositoryNode repositoryNode = getRepositoryNode(folderNode, curNode, view, expanded);
                if (repositoryNode != null) {
                    return repositoryNode;
                }
            }

            for (IRepositoryNode jobNode : testCaseFather) {
                final RepositoryNode repositoryNode = getRepositoryNode(jobNode, curNode, view, expanded);
                if (repositoryNode != null) {
                    return repositoryNode;
                }
            }
        }

        return null;
    }

    private static boolean isHadoopClusterNode(IRepositoryNode node) {
        return hadoopClusterService != null && hadoopClusterService.isHadoopClusterNode(node);
    }

    public static void expandNode(IRepositoryView view, RepositoryNode curNode, Set<RepositoryNode> nodes) {
        getRepositoryCheckedNode((IRepositoryNode) view.getRoot(), curNode.getObject(), view, true, nodes);
    }

    private static RepositoryNode getRepositoryCheckedNode(IRepositoryNode rootNode, IRepositoryViewObject curNode,
            IRepositoryView view, boolean expanded, Set<RepositoryNode> nodes) {
        if (rootNode == null || curNode == null || view == null) {
            return null;
        }
        if (expanded) {
            // expande the unvisible node
            expandNode((RepositoryNode) rootNode, curNode, view);
        }
        final List<IRepositoryNode> children = rootNode.getChildren();

        if (children != null) {
            // in the first, search the current folder
            List<IRepositoryNode> folderChild = new ArrayList<IRepositoryNode>();

            for (IRepositoryNode childNode : children) {
                if (isRepositoryFolder(childNode) || childNode.getType() == ENodeType.REFERENCED_PROJECT) {
                    if (hasCheckedChild(childNode, nodes)) {
                        folderChild.add(childNode);
                    }

                } else if (childNode.getId().equals(curNode.getId())
                        && childNode.getObjectType() == curNode.getRepositoryObjectType()) {
                    return (RepositoryNode) childNode;
                }

            }
            for (IRepositoryNode folderNode : folderChild) {
                final RepositoryNode repositoryNode = getRepositoryCheckedNode(folderNode, curNode, view, expanded,
                        nodes);
                if (repositoryNode != null) {
                    return repositoryNode;
                }
            }
        }

        return null;
    }

    private static boolean hasCheckedChild(IRepositoryNode fatherNode, Set<RepositoryNode> nodes) {
        if (!fatherNode.getChildren().isEmpty()) {
            for (IRepositoryNode node : fatherNode.getChildren()) {
                for (IRepositoryNode pnode : nodes) {
                    if (node.equals(pnode)) {
                        return true;
                    }
                }
                boolean flag = hasCheckedChild(node, nodes);
                if (flag) {
                    return true;
                }
            }
        } else {
            for (IRepositoryNode node : nodes) {
                if (node.equals(fatherNode)) {
                    return true;
                }
            }
        }
        return false;
    }

    private static void expandNode(RepositoryNode rootNode, IRepositoryViewObject curNode, IRepositoryView view) {
        if (rootNode == null || curNode == null || view == null) {
            return;
        }
        final ERepositoryObjectType rootContextType = rootNode.getContentType();
        final ERepositoryObjectType curType = curNode.getRepositoryObjectType();

        // for referenced project
        if (rootContextType == ERepositoryObjectType.REFERENCED_PROJECTS
                || rootNode.getType() == ENodeType.REFERENCED_PROJECT) {
            expandParentNode(view, rootNode);
        }
        if (rootContextType != null && curType != null) {

            ERepositoryObjectType tmpType = null;
            if (curType == ERepositoryObjectType.METADATA_CON_TABLE
                    || curType == ERepositoryObjectType.METADATA_CON_VIEW
                    || curType == ERepositoryObjectType.METADATA_CON_SYNONYM
                    || curType == ERepositoryObjectType.METADATA_CON_QUERY
                    || curType == ERepositoryObjectType.METADATA_CONNECTIONS
                    || curType == ERepositoryObjectType.METADATA_FILE_DELIMITED
                    || curType == ERepositoryObjectType.METADATA_FILE_POSITIONAL
                    || curType == ERepositoryObjectType.METADATA_FILE_REGEXP
                    || curType == ERepositoryObjectType.METADATA_FILE_XML
                    || curType == ERepositoryObjectType.METADATA_FILE_LDIF
                    || curType == ERepositoryObjectType.METADATA_FILE_EXCEL
                    || curType == ERepositoryObjectType.METADATA_GENERIC_SCHEMA
                    || curType == ERepositoryObjectType.METADATA_LDAP_SCHEMA
                    || curType == ERepositoryObjectType.METADATA_SALESFORCE_SCHEMA
                    || curType == ERepositoryObjectType.METADATA_WSDL_SCHEMA
                    || curType == ERepositoryObjectType.METADATA_FILE_EBCDIC
                    || curType == ERepositoryObjectType.METADATA_FILE_HL7
                    || curType == ERepositoryObjectType.METADATA_FILE_FTP
                    || curType == ERepositoryObjectType.METADATA_FILE_BRMS
                    || curType == ERepositoryObjectType.METADATA_MDMCONNECTION
                    || curType == ERepositoryObjectType.METADATA_FILE_RULES
                    || curType == ERepositoryObjectType.METADATA_FILE_LINKRULES
                    || curType == ERepositoryObjectType.METADATA_SAPCONNECTIONS
                    || curType == ERepositoryObjectType.METADATA_HEADER_FOOTER) {
                tmpType = ERepositoryObjectType.METADATA;
            } else if (curType == ERepositoryObjectType.ROUTINES || curType == ERepositoryObjectType.SNIPPETS) {
                tmpType = ERepositoryObjectType.ROUTINES;
            } else if (curType.equals(ERepositoryObjectType.DOCUMENTATION)
                    || curType.equals(ERepositoryObjectType.JOB_DOC)
                    || curType.equals(ERepositoryObjectType.JOBLET_DOC)) {
                tmpType = ERepositoryObjectType.DOCUMENTATION;
            }

            if (tmpType != null && tmpType == rootContextType) {
                expandParentNode(view, rootNode);
            }
            // expand the parent node

            if (curType == rootContextType && isRepositoryFolder(rootNode)) {
                if (rootContextType == ERepositoryObjectType.SQLPATTERNS
                        && !(rootNode.getParent() instanceof IProjectRepositoryNode)) {
                    // sql pattern
                } else {
                    expandParentNode(view, rootNode);
                    view.getViewer().refresh();
                }
            }

        }
    }

    public static void expandParentNode(IRepositoryView view, IRepositoryNode node) {
        if (view == null || node == null) {
            return;
        }
        expandParentNode(view, node.getParent());
        view.expand(node, true);
        // for db
        StructuredViewer viewer = view.getViewer();
        if (viewer instanceof TreeViewer) {
            TreeViewer treeViewer = (TreeViewer) viewer;
            ERepositoryObjectType objectType = node.getObjectType();
            if (objectType != null) {
                if (objectType == ERepositoryObjectType.METADATA_CONNECTIONS) {
                    treeViewer.expandToLevel(node, TreeViewer.ALL_LEVELS);
                } else if (objectType == ERepositoryObjectType.ROUTINES) {
                    treeViewer.expandToLevel(node, 2);
                }
            }
        }

    }

    private static boolean isRepositoryFolder(IRepositoryNode node) {
        if (node == null) {
            return false;
        }
        final ENodeType type = node.getType();
        if (type == ENodeType.SIMPLE_FOLDER || type == ENodeType.STABLE_SYSTEM_FOLDER
                || type == ENodeType.SYSTEM_FOLDER) {
            return true;
        }
        return false;
    }

    public static RepositoryNode getMetadataTableFromConnection(String schemaValue) {
        String[] values = schemaValue.split(" - "); //$NON-NLS-1$
        String repositoryID = values[0];
        String tableName = values[1];

        try {
            final RepositoryNode realNode = getRepositoryNode(repositoryID);
            if (realNode.getObject() != null && realNode.getObject().getProperty() != null) {
                Item item = realNode.getObject().getProperty().getItem();
                if (item instanceof SAPConnectionItem) {
                    return getSAPSchemaFromConnection(realNode, schemaValue);
                } else {
                    return getSchemeFromConnection(realNode, tableName, ERepositoryObjectType.METADATA_CON_TABLE);
                }
            }

        } catch (Exception e) {
            ExceptionHandler.process(e);
        }
        return null;
    }

    private static RepositoryNode getSAPSchemaFromConnection(RepositoryNode realNode, String name) {
        String[] values = name.split(" - "); //$NON-NLS-1$
        if (values.length != 3) {
            return null;
        }
        String metadataName = values[2];
        String repositoryId = name.substring(0, name.lastIndexOf(" - ")); //$NON-NLS-1$
        RepositoryNode functionNode = getSAPFunctionFromConnection(repositoryId);
        for (IRepositoryNode node : functionNode.getChildren()) {
            if (metadataName.equals(node.getProperties(EProperties.LABEL))) {
                return (RepositoryNode) node;
            }
        }
        return null;
    }

    public static RepositoryNode getQueryFromConnection(String schemaValue) {
        String[] values = schemaValue.split(" - "); //$NON-NLS-1$
        String repositoryID = values[0];
        String tableName = values[1];

        try {
            final RepositoryNode realNode = getRepositoryNode(repositoryID);
            return getSchemeFromConnection(realNode, tableName, ERepositoryObjectType.METADATA_CON_QUERY);
        } catch (Exception e) {
            ExceptionHandler.process(e);
        }
        return null;
    }

    public static RepositoryNode getSAPFunctionFromConnection(String id) {
        String[] values = id.split(" - "); //$NON-NLS-1$
        String repositoryID = values[0];
        String functionName = values[1];

        try {
            final RepositoryNode realNode = getRepositoryNode(repositoryID);
            if (realNode.getObject() != null) {
                if (ERepositoryObjectType.METADATA_SAPCONNECTIONS
                        .equals(realNode.getObject().getRepositoryObjectType())) {
                    for (IRepositoryNode node : realNode.getChildren()) {
                        if (Messages.getString("RepositoryContentProvider.repositoryLabel.sapFunction") //$NON-NLS-1$
                                .equals(node.getLabel())) {
                            for (IRepositoryNode function : node.getChildren()) {
                                if (functionName.equals(function.getProperties(EProperties.LABEL))) {
                                    return (RepositoryNode) function;
                                }
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            ExceptionHandler.process(e);
        }
        return null;
    }

    private static RepositoryNode getSchemeFromConnection(RepositoryNode connection, String tableName,
            ERepositoryObjectType repType) {
        ERepositoryObjectType type = connection.getObject().getRepositoryObjectType();
        IGenericWizardService wizardService = null;
        if (GlobalServiceRegister.getDefault().isServiceRegistered(IGenericWizardService.class)) {
            wizardService = (IGenericWizardService) GlobalServiceRegister.getDefault()
                    .getService(IGenericWizardService.class);
        }
        if (wizardService != null && wizardService.isGenericType(type)) {
            return getGenericSchemaNode(connection, tableName);
        }
        if (repType == ERepositoryObjectType.METADATA_CON_QUERY) {
            for (IRepositoryNode node : connection.getChildren()) {
                if (Messages.getString("RepositoryContentProvider.repositoryLabel.Queries") //$NON-NLS-1$
                        .equals(node.getLabel())) {
                    for (IRepositoryNode query : node.getChildren()) {
                        if (tableName.equals(query.getProperties(EProperties.LABEL))) {
                            return (RepositoryNode) query;
                        }
                    }
                }
            }
        } else {
            if (type == ERepositoryObjectType.METADATA_CONNECTIONS) {
                for (IRepositoryNode child : connection.getChildren()) {
                    if (Messages.getString("RepositoryContentProvider.repositoryLabel.Queries") //$NON-NLS-1$
                            .equals(child.getLabel())) {
                        continue;
                    }
                    for (IRepositoryNode node : child.getChildren()) {
                        if (tableName.equals(node.getProperties(EProperties.LABEL))) {
                            return (RepositoryNode) node;
                        }
                    }
                }
            } else {
                for (IRepositoryNode child : connection.getChildren()) {
                    if (tableName.equals(child.getProperties(EProperties.LABEL))) {
                        return (RepositoryNode) child;
                    }
                }

            }

        }
        return null;
    }

    private static RepositoryNode getGenericSchemaNode(RepositoryNode parentNode, String tableName) {
        RepositoryNode node = null;
        Object type = parentNode.getProperties(EProperties.CONTENT_TYPE);
        Object label = parentNode.getProperties(EProperties.LABEL);
        if (ERepositoryObjectType.METADATA_CON_TABLE.equals(type) && tableName.equals(label)) {
            node = parentNode;
        }
        for (IRepositoryNode child : parentNode.getChildren()) {
            RepositoryNode sNode = getGenericSchemaNode((RepositoryNode) child, tableName);
            if (sNode != null) {
                node = sNode;
            }
        }
        return node;
    }

    /**
     * 
     * ggu Comment method "getParentRepositoryNodeFromSelection".
     * 
     */
    public static RepositoryNode getParentRepositoryNodeFromSelection(IRepositoryViewObject object) {
        if (object.getRepositoryNode() != null
                && ((RepositoryNode) object.getRepositoryNode()).getParent() != null) {
            return ((RepositoryNode) object.getRepositoryNode()).getParent();
        }

        // "old" code bellow should never be called, unless the repository object is a new created and not from the
        // repository.

        IRepositoryView viewPart = getRepositoryView();
        if (viewPart != null) {
            ISelection repositoryViewSelection = viewPart.getViewer().getSelection();

            if (repositoryViewSelection instanceof IStructuredSelection) {
                RepositoryNode selectedRepositoryNode = (RepositoryNode) ((IStructuredSelection) repositoryViewSelection)
                        .getFirstElement();
                // fixed for the opened job and lost the selected node.
                if (object != null) {

                    selectedRepositoryNode = getRepositoryNode(object, false);

                }
                if (selectedRepositoryNode != null) {
                    return selectedRepositoryNode.getParent();
                }
            }
        }
        return null;

    }

    public static void checkItemDependencies(Item item, List<IRepositoryViewObject> repositoryObjects) {
        checkItemDependencies(item, repositoryObjects, true, true);
    }

    public static void checkItemDependencies(Item item, List<IRepositoryViewObject> repositoryObjects,
            boolean includeSystemItems, boolean includeReferenceProjectItems) {
        if (item == null) {
            return;
        }
        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        RelationshipItemBuilder builder = RelationshipItemBuilder.getInstance();
        List<Relation> relations = builder.getItemsRelatedTo(item.getProperty().getId(),
                item.getProperty().getVersion(), RelationshipItemBuilder.JOB_RELATION);
        relations.addAll(builder.getItemsRelatedTo(item.getProperty().getId(), item.getProperty().getVersion(),
                RelationshipItemBuilder.JOBLET_RELATION));
        try {
            for (Relation relation : relations) {
                IRepositoryViewObject obj = null;
                String id = relation.getId();
                if (RelationshipItemBuilder.ROUTINE_RELATION.equals(relation.getType())) {
                    // TDI-20915
                    Project mainProject = ProjectManager.getInstance().getCurrentProject();
                    obj = getRoutineFromName(mainProject, id, includeSystemItems);
                    if (obj == null) {
                        List<Project> refProjects = ProjectManager.getInstance().getReferencedProjects(mainProject);
                        for (Project refPro : refProjects) {
                            obj = getRoutineFromName(refPro, id, includeSystemItems);
                            if (obj != null) {
                                break;
                            }
                        }
                    }
                } else {
                    if (id != null && id.indexOf(" - ") != -1) { //$NON-NLS-1$
                        id = id.substring(0, id.lastIndexOf(" - ")); //$NON-NLS-1$
                    }
                    if (includeReferenceProjectItems) {
                        obj = factory.getLastVersion(id);
                    } else {
                        obj = factory.getLastVersion(ProjectManager.getInstance().getCurrentProject(), id);
                    }
                }
                checkItemDependencies(obj, repositoryObjects, includeSystemItems, includeReferenceProjectItems);
            }

            // fix for TDI-19548 , and should be removed after implement add connection and context relationship to
            // RelationshipItemBuilder
            if (item instanceof ConnectionItem) {
                ConnectionItem connectionItem = (ConnectionItem) item;
                if (connectionItem.getConnection().isContextMode()) {
                    String id = connectionItem.getConnection().getContextId();
                    if (id != null) {
                        IRepositoryViewObject object = null;
                        if (includeReferenceProjectItems) {
                            object = factory.getLastVersion(id);
                        } else {
                            object = factory.getLastVersion(ProjectManager.getInstance().getCurrentProject(), id);
                        }
                        checkItemDependencies(object, repositoryObjects, includeSystemItems,
                                includeReferenceProjectItems);
                    }
                }
            }
        } catch (PersistenceException et) {
            ExceptionHandler.process(et);
        }

    }

    private static void checkItemDependencies(IRepositoryViewObject obj,
            List<IRepositoryViewObject> repositoryObjects, boolean includeSystemItems,
            boolean includeReferenceProjectItems) {
        if (obj != null && !repositoryObjects.contains(obj)) {
            repositoryObjects.add(obj);
            checkAllVersionLatest(repositoryObjects, obj, includeSystemItems, includeReferenceProjectItems);
            checkItemDependencies(obj.getProperty().getItem(), repositoryObjects, includeSystemItems,
                    includeReferenceProjectItems);
        }
    }

    private static void checkAllVersionLatest(List<IRepositoryViewObject> repositoryObjects,
            IRepositoryViewObject object, boolean includeSystemItems, boolean includeReferenceProjectItems) {
        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        RelationshipItemBuilder builder = RelationshipItemBuilder.getInstance();
        if (object.getRepositoryNode() != null) {
            List<Relation> relations = builder.getItemsJobRelatedTo(object.getId(), object.getVersion(),
                    RelationshipItemBuilder.JOB_RELATION);
            for (Relation relation : relations) {
                try {
                    IRepositoryViewObject obj = null;
                    if (includeReferenceProjectItems) {
                        obj = factory.getLastVersion(relation.getId());
                    } else {
                        obj = factory.getLastVersion(ProjectManager.getInstance().getCurrentProject(),
                                relation.getId());
                    }
                    if (obj != null && !repositoryObjects.contains(obj)) {
                        repositoryObjects.add(obj);
                        checkAllVersionLatest(repositoryObjects, obj, includeSystemItems,
                                includeReferenceProjectItems);
                    }
                } catch (PersistenceException et) {
                    ExceptionHandler.process(et);
                }
            }
        }
    }

    public static IRepositoryViewObject getRoutineFromName(Project tempProject, String name,
            boolean includeSystem) {
        if (name == null) {
            return null;
        }

        IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
        try {
            List<IRepositoryViewObject> all = factory.getAll(tempProject, ERepositoryObjectType.ROUTINES);
            if (PluginChecker.isPigudfPluginLoaded()) {
                all.addAll(factory.getAll(tempProject, ERepositoryObjectType.PIG_UDF));
            }
            for (IRepositoryViewObject obj : all) {
                if (obj != null && obj.getProperty() != null) {
                    Item item = obj.getProperty().getItem();
                    String label = obj.getProperty().getLabel();
                    if (item != null && item instanceof RoutineItem) {
                        RoutineItem routineItem = (RoutineItem) item;
                        if (name.equals(label)) {
                            if (!includeSystem && routineItem.isBuiltIn()) {
                                continue;
                            } else {
                                return obj;
                            }
                        }
                    }
                }
            }
        } catch (PersistenceException e) {
            ExceptionHandler.process(e);
        }

        return null;
    }
}