// ============================================================================
//
// Copyright (C) 2006-2012 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.ui.dialog;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.talend.commons.CommonsPlugin;
import org.talend.commons.utils.time.TimeMeasure;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IESBService;
import org.talend.core.PluginChecker;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.model.metadata.MetadataColumnRepositoryObject;
import org.talend.core.model.metadata.MetadataTable;
import org.talend.core.model.metadata.MetadataTalendType;
import org.talend.core.model.metadata.Query;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.connection.HeaderFooterConnection;
import org.talend.core.model.metadata.builder.connection.XmlFileConnection;
import org.talend.core.model.metadata.designerproperties.RepositoryToComponentProperty;
import org.talend.core.model.param.ERepositoryCategoryType;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.HeaderFooterConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.DragAndDropManager;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.utils.IDragAndDropServiceHandler;
import org.talend.core.model.utils.RepositoryManagerHelper;
import org.talend.core.repository.model.repositoryObject.MetadataTableRepositoryObject;
import org.talend.core.ui.ICDCProviderService;
import org.talend.repository.ProjectManager;
import org.talend.repository.i18n.Messages;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.ProjectRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.model.SAPFunctionRepositoryObject;
import org.talend.repository.model.nodes.IProjectRepositoryNode;
import org.talend.repository.ui.utils.RecombineRepositoryNodeUtil;
import org.talend.repository.ui.views.IRepositoryView;
import org.talend.repository.viewer.ui.provider.RepositoryViewerProvider;
import org.talend.repository.viewer.ui.viewer.RepositoryTreeViewer;
/**
* bqian check the content of the repository view. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
public class RepositoryReviewDialog extends Dialog {
ERepositoryObjectType type;
String repositoryType;
private String[] repositoryTypes;
private RepositoryNode result;
ITypeProcessor typeProcessor;
/*
* selectedNodeName,isSelectionId,selectionType for selection
*/
private String selectedNodeName;
private boolean isSelectionId;
private ERepositoryObjectType selectionType;
private ViewerFilter[] additionalFilters;
private DatabaseTypeFilter dbSupportFilter;
ViewerTextFilter textFilter = new ViewerTextFilter();
private RepositoryTreeViewer repositoryTreeViewer;
private IRepositoryView repView;
protected RepositoryReviewDialog(Shell parentShell) {
super(parentShell);
setShellStyle(SWT.SHELL_TRIM | SWT.APPLICATION_MODAL | getDefaultOrientation());
boolean debugMode = CommonsPlugin.isDebugMode();
// debugMode = true;
TimeMeasure.display = debugMode;
TimeMeasure.displaySteps = debugMode;
TimeMeasure.measureActive = debugMode;
TimeMeasure.begin(RepositoryReviewDialog.class.getSimpleName());
}
/**
* DOC bqian RepositoryReviewDialog constructor comment.
*
* @param parentShell
* @param type support ERepositoryObjectType.PROCESS -> process <br>
* ERepositoryObjectType.METADATA --> Repository <br>
* ERepositoryObjectType.METADATA_CON_TABLE --> Schema <br>
* ERepositoryObjectType.METADATA_CON_QUERY --> Query <br>
*
* @param repositoryType String repositoryType = elem.getElementParameter(paramName).getRepositoryValue();<br>
* see DynamicComposite.updateRepositoryListExtra().<br>
*
*
*/
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, String repositoryType) {
this(parentShell);
this.type = type;
/*
* avoid select self repository node for Process Type.
*
* borrow the repositoryType to set the current process id here.
*/
this.repositoryType = repositoryType;
typeProcessor = createTypeProcessor();
}
public RepositoryReviewDialog(Shell parentShell, String[] repositoryTypes) {
this(parentShell);
this.repositoryTypes = repositoryTypes;
typeProcessor = createTypeProcessor();
}
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, String repositoryType, String[] itemFilter) {
this(parentShell, type, repositoryType);
this.dbSupportFilter = new DatabaseTypeFilter(itemFilter);
}
/**
* DOC ycbai RepositoryReviewDialog constructor comment.
*
* @param parentShell
* @param type
* @param repositoryType
* @param additionalFilter
*/
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, String repositoryType,
ViewerFilter[] additionalFilters) {
this(parentShell, type, repositoryType);
this.additionalFilters = additionalFilters;
}
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, Boolean isHeaderButton, String repositoryType) {
this(parentShell, type, repositoryType);
if (typeProcessor instanceof RepositoryTypeProcessor) {
((RepositoryTypeProcessor) typeProcessor).setHeaderButton(isHeaderButton);
}
}
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, String repositoryType,
boolean hidenTypeSelection, boolean needInitialize) {
this(parentShell, type, repositoryType);
if (hidenTypeSelection && (typeProcessor instanceof RepositoryTypeProcessor)) {
((RepositoryTypeProcessor) typeProcessor).setHidenTypeSelection(hidenTypeSelection);
}
}
public RepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type) {
this(parentShell, type, null);
}
public RepositoryReviewDialog(Shell parentShell, ITypeProcessor typeProcessor, ERepositoryObjectType type) {
this(parentShell, type);
this.typeProcessor = typeProcessor;
}
protected RepositoryTreeViewer getRepositoryTreeViewer() {
return repositoryTreeViewer;
}
protected IRepositoryView getRepView() {
if (repView == null) {
repView = RepositoryManagerHelper.findRepositoryView();
}
return repView;
}
/**
* bqian create the correct TypeProcessor according to the type.
*
* @return
*/
private ITypeProcessor createTypeProcessor() {
if (type == ERepositoryObjectType.PROCESS) {
return new JobTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA) {
return new RepositoryTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA_CON_TABLE) {
return new SchemaTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA_CON_QUERY) {
return new QueryTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA_SAP_FUNCTION) {
return new SAPFunctionProcessor(repositoryType);
}
if (type == ERepositoryObjectType.CONTEXT) {
return new ContextTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA_HEADER_FOOTER) {
return new HeaderFooterTypeProcessor(repositoryType);
}
if (type == ERepositoryObjectType.METADATA_VALIDATION_RULES) {
return new ValidationRuleTypeProcessor(repositoryType);
}
if (repositoryTypes != null) {
return new MetadataMultiTypeProcessor(repositoryTypes);
}
throw new IllegalArgumentException(Messages.getString("RepositoryReviewDialog.0", type)); //$NON-NLS-1$
}
/**
* Configures the shell
*
* @param shell the shell
*/
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
// Set the title bar text and the size
if (typeProcessor.getDialogTitle() == null) {
shell.setText(Messages.getString("RepositoryReviewDialog.repositoryContent")); //$NON-NLS-1$
} else {
shell.setText(typeProcessor.getDialogTitle());
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "before createDialogArea..."); //$NON-NLS-1$
GridData data = (GridData) container.getLayoutData();
data.minimumHeight = 400;
data.heightHint = 400;
data.minimumWidth = 500;
data.widthHint = 500;
container.setLayoutData(data);
createFilterField(container);
Composite viewContainer = new Composite(container, SWT.BORDER);
viewContainer.setLayout(new GridLayout());
viewContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
RepositoryViewerProvider provider = new RepositoryViewerProvider() {
@Override
protected IRepositoryNode getInputRoot(IProjectRepositoryNode projectRepoNode) {
return typeProcessor.getInputRoot(projectRepoNode);
}
@Override
protected TreeViewer createTreeViewer(Composite parent, int style) {
return new RepositoryTreeViewer(parent, style);
}
};
repositoryTreeViewer = (RepositoryTreeViewer) provider.createViewer(viewContainer);
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "finshed createViewer"); //$NON-NLS-1$
repositoryTreeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
addFilter(textFilter);
if (dbSupportFilter != null) {
addFilter(dbSupportFilter);
}
if (additionalFilters != null) {
addFilter(additionalFilters);
}
ViewerFilter filter = typeProcessor.makeFilter();
addFilter(filter);
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "finshed add Filters"); //$NON-NLS-1$
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "set input"); //$NON-NLS-1$
repositoryTreeViewer.expandAll();
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "expandAll"); //$NON-NLS-1$
// see feature 0003664: tRunJob: When opening the tree dialog to select the job target, it could be useful to
// open it on previous selected job if exists
selectNode();
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "selectNode"); //$NON-NLS-1$
repositoryTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
boolean highlightOKButton = isSelectionValid(event);
getButton(IDialogConstants.OK_ID).setEnabled(highlightOKButton);
}
});
repositoryTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if (getButton(IDialogConstants.OK_ID).isEnabled()) {
okPressed();
}
}
});
TimeMeasure.step(RepositoryReviewDialog.class.getSimpleName(), "finished createDialogArea..."); //$NON-NLS-1$
TimeMeasure.end(RepositoryReviewDialog.class.getSimpleName());
TimeMeasure.display = false;
TimeMeasure.displaySteps = false;
TimeMeasure.measureActive = false;
return container;
}
private IRepositoryNode getInput() {
return typeProcessor.getInputRoot(ProjectRepositoryNode.getInstance());
}
public void addFilter(ViewerFilter filter) {
if (filter != null) {
getRepositoryTreeViewer().addFilter(filter);
}
}
public void addFilter(ViewerFilter[] filters) {
if (filters != null) {
for (ViewerFilter filter : filters) {
addFilter(filter);
}
}
}
protected boolean isSelectionValid(SelectionChangedEvent event) {
boolean highlightOKButton = true;
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (selection == null || selection.size() != 1) {
highlightOKButton = false;
} else {
RepositoryNode node = (RepositoryNode) selection.getFirstElement();
if (node.getType() != ENodeType.REPOSITORY_ELEMENT) {
highlightOKButton = false;
}
// else if (t == ERepositoryObjectType.SERVICESOPERATION) {
// return highlightOKButton;
// }
else if (!typeProcessor.isSelectionValid(node)) {
highlightOKButton = false;
}
}
return highlightOKButton;
}
/**
* DOC bqian Comment method "createFilterField".
*
* @param container
*/
private void createFilterField(Composite container) {
if (type != ERepositoryObjectType.PROCESS) {
return;
}
// create text filter
Label label = new Label(container, SWT.NONE);
label.setText(Messages.getString("RepositoryReviewDialog.jobNameFormat")); //$NON-NLS-1$
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Text text = new Text(container, SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String pattern = text.getText();
pattern = pattern.replace("*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$
pattern = pattern.replace("?", "."); //$NON-NLS-1$ //$NON-NLS-2$
pattern = "(?i)" + pattern + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
textFilter.setText(pattern);
getRepositoryTreeViewer().refresh();
getRepositoryTreeViewer().expandAll();
// repositoryView.selectFirstOne();
}
});
}
public void setSelectedNodeName(String selectionNode) {
this.selectedNodeName = selectionNode;
}
public void setSelectedNodeName(ERepositoryObjectType selectionType, String selectionNode, boolean isSelectionId) {
setSelectedNodeName(selectionNode);
this.selectionType = selectionType;
this.isSelectionId = isSelectionId;
}
private void selectNode() {
/*
* Make sure expand all. Just notice it here, because have been expand before.
*/
// getRepositoryTreeViewer().expandAll();
RepositoryNode root = (RepositoryNode) getRepositoryTreeViewer().getInput();
selectNode(root, this.selectionType, this.selectedNodeName, this.isSelectionId);
}
private void selectNode(RepositoryNode root, ERepositoryObjectType selectionType, String idOrLabel, boolean isSelectionId) {
if (idOrLabel == null) {
return;
}
if (selectionType != null) {
if (root.getContentType() != selectionType || root.getObjectType() != selectionType) {
return;
}
}
boolean valid = false;
if (isSelectionId) {
IRepositoryViewObject object = root.getObject();
if (object != null && idOrLabel.equals(object.getId())) {
valid = true;
}
} else if (idOrLabel.equals(root.getProperties(EProperties.LABEL))) {
valid = true;
}
if (valid) {
getRepositoryTreeViewer().setSelection(new StructuredSelection(root), true);
} else if (root.hasChildren()) {
for (IRepositoryNode child : root.getChildren()) {
selectNode((RepositoryNode) child, selectionType, idOrLabel, isSelectionId);
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
IStructuredSelection selection = (IStructuredSelection) getRepositoryTreeViewer().getSelection();
result = (RepositoryNode) selection.getFirstElement();
super.okPressed();
}
public RepositoryNode getResult() {
return result;
}
public void setJobIDList(List<String> jobIDList) {
if (this.typeProcessor instanceof JobTypeProcessor) {
((JobTypeProcessor) this.typeProcessor).setJobIDList(jobIDList);
}
}
}
/**
* bqian decouple the process logic of JOB, REPOSITORY, SCHEMA, QUERY <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
interface ITypeProcessor {
boolean isSelectionValid(RepositoryNode node);
IRepositoryNode getInputRoot(IProjectRepositoryNode projectRepoNode);
ViewerFilter makeFilter();
String getDialogTitle();
}
/**
*
* ggu class global comment. Detailled comment
*/
abstract class MultiTypesProcessor implements ITypeProcessor {
private String[] repositoryTypes;
public MultiTypesProcessor(String[] repositoryTypes) {
super();
this.repositoryTypes = repositoryTypes;
}
protected String[] getRepositoryTypes() {
return repositoryTypes;
}
protected abstract List<ERepositoryObjectType> getTypes();
public IRepositoryNode getInputRoot(IProjectRepositoryNode projectRepoNode) {
return RecombineRepositoryNodeUtil.getFixingTypesInputRoot(projectRepoNode, getTypes());
}
public boolean isSelectionValid(RepositoryNode node) {
Object nodeType = node.getProperties(EProperties.CONTENT_TYPE);
List<ERepositoryObjectType> types = getTypes();
if (types != null) {
for (ERepositoryObjectType type : types) {
if (nodeType == type) {
return true;
}
}
}
return false;
}
public ViewerFilter makeFilter() {
return new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
return selectRepositoryNode(viewer, (RepositoryNode) parentElement, (RepositoryNode) element);
}
};
}
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (node == null)
return false;
IRepositoryViewObject object = node.getObject();
if (object != null) {
// column
if (object instanceof MetadataColumnRepositoryObject) {
return false;
}
}
// hide the column folder
if (object == null && node.getParent() != null && node.getParent().getObject() != null
&& node.getParent().getObjectType() == ERepositoryObjectType.METADATA_CON_TABLE) {
return false;
}
// cdc
ICDCProviderService cdcService = null;
if (node.getObjectType() == ERepositoryObjectType.METADATA_CON_CDC) {
return false;
}
if (isCDCConnection(node)) {
return false;
}
if (PluginChecker.isCDCPluginLoaded()) {
cdcService = (ICDCProviderService) GlobalServiceRegister.getDefault().getService(ICDCProviderService.class);
if (cdcService != null && cdcService.isSubscriberTableNode(node)) {
return false;
}
}
return true;
}
protected final boolean isCDCConnection(RepositoryNode node) {
ICDCProviderService service = null;
if (PluginChecker.isCDCPluginLoaded()) {
service = (ICDCProviderService) GlobalServiceRegister.getDefault().getService(ICDCProviderService.class);
}
if (node != null && node.getType() == ENodeType.STABLE_SYSTEM_FOLDER) {
List<IRepositoryNode> children = node.getChildren();
if (children != null) {
for (IRepositoryNode child : children) {
if (service != null && service.isSystemSubscriberTable((RepositoryNode) child)) {
return true;
}
}
}
}
return false;
}
public String getDialogTitle() {
return null;
}
}
/**
*
* ggu class global comment. Detailled comment
*/
abstract class SingleTypeProcessor extends MultiTypesProcessor {
public SingleTypeProcessor(String repositoryType) {
super(new String[] { repositoryType });
}
protected String getRepositoryType() {
return getRepositoryTypes()[0];
}
protected List<ERepositoryObjectType> getTypes() {
List<ERepositoryObjectType> types = new ArrayList<ERepositoryObjectType>();
ERepositoryObjectType type = getType();
if (type != null) {
types.add(type);
}
return types;
}
protected abstract ERepositoryObjectType getType();
public boolean isSelectionValid(RepositoryNode node) {
if (node.getObjectType() == getType()) {
return true;
}
return false;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (node == null)
return false;
if (node.getContentType() == getType()) {
return false;
}
if (isCDCConnection(node)) {
return false;
}
return true;
}
}
/**
* bqian TypeProcessor for Job. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
class JobTypeProcessor extends SingleTypeProcessor {
private List<String> jobIDList;
/**
* ggu JobTypeProcessor constructor comment.
*/
public JobTypeProcessor(String curJobId) {
super(curJobId);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.PROCESS;
}
public List<String> getJobIDList() {
return jobIDList;
}
public void setJobIDList(List<String> jobIDList) {
this.jobIDList = jobIDList;
}
public boolean isSelectionValid(RepositoryNode node) {
ERepositoryObjectType t = (ERepositoryObjectType) node.getProperties(EProperties.CONTENT_TYPE);
List<String> idList = getJobIDList();
if (idList != null && t == ERepositoryObjectType.PROCESS) {
if (idList.contains(node.getObject().getId())) {
MessageDialog.openWarning(Display.getCurrent().getActiveShell(),
Messages.getString("RepositoryReviewDialog.waringTitle"), //$NON-NLS-1$
Messages.getString("RepositoryReviewDialog.waringMessages")); //$NON-NLS-1$
return false;
}
}
if (node.getProperties(EProperties.CONTENT_TYPE) == getType()) {
return true;
}
return false;
// else {
// if (node.getProperties(EProperties.CONTENT_TYPE) != ERepositoryObjectType.METADATA_CON_TABLE) {
// highlightOKButton = false;
// }
// }
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (getRepositoryType() != null && node.getObject() != null) {
if (node.getObject().getId() == null || node.getObject().getId().equals(getRepositoryType())) {
return false;
}
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.ui.dialog.ITypeProcessor#getDialogTitle()
*/
public String getDialogTitle() {
return Messages.getString("OpenJobSelectionDialog.findJob"); //$NON-NLS-1$
}
}
/**
* bqian TypeProcessor for Repository. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
class RepositoryTypeProcessor extends SingleTypeProcessor {
boolean hidenTypeSelection;
boolean isHeaderButton;
/**
* DOC bqian RepositoryTypeProcessor constructor comment.
*
* @param repositoryType
*/
public RepositoryTypeProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
final String repositoryType = getRepositoryType();
if (repositoryType == null) { // all
return ERepositoryObjectType.METADATA;
}
if (repositoryType.equals(ERepositoryCategoryType.DELIMITED.getName())) {
return ERepositoryObjectType.METADATA_FILE_DELIMITED;
}
if (repositoryType.equals(ERepositoryCategoryType.POSITIONAL.getName())) {
return ERepositoryObjectType.METADATA_FILE_POSITIONAL;
}
if (repositoryType.equals(ERepositoryCategoryType.REGEX.getName())) {
return ERepositoryObjectType.METADATA_FILE_REGEXP;
}
if (repositoryType.equals(ERepositoryCategoryType.XML.getName())
|| repositoryType.equals(ERepositoryCategoryType.XMLOUTPUT.getName())) {
return ERepositoryObjectType.METADATA_FILE_XML;
}
if (repositoryType.equals(ERepositoryCategoryType.LDIF.getName())) {
return ERepositoryObjectType.METADATA_FILE_LDIF;
}
if (repositoryType.equals(ERepositoryCategoryType.EXCEL.getName())) {
return ERepositoryObjectType.METADATA_FILE_EXCEL;
}
if (repositoryType.equals(ERepositoryCategoryType.GENERIC.getName())) {
return ERepositoryObjectType.METADATA_GENERIC_SCHEMA;
}
if (repositoryType.equals(ERepositoryCategoryType.LDAP.getName())) {
return ERepositoryObjectType.METADATA_LDAP_SCHEMA;
}
if (repositoryType.equals(ERepositoryCategoryType.WSDL.getName())) {
return ERepositoryObjectType.METADATA_WSDL_SCHEMA;
}
if (repositoryType.equals(ERepositoryCategoryType.SALESFORCE.getName())) {
return ERepositoryObjectType.METADATA_SALESFORCE_SCHEMA;
}
if (repositoryType.startsWith(ERepositoryCategoryType.DATABASE.getName())) {
return ERepositoryObjectType.METADATA_CONNECTIONS;
}
if (repositoryType.startsWith(ERepositoryCategoryType.SAP.getName())) {
return ERepositoryObjectType.METADATA_SAPCONNECTIONS;
}
if (repositoryType.startsWith(ERepositoryCategoryType.HEADERFOOTER.getName())) {
return ERepositoryObjectType.METADATA_HEADER_FOOTER;
}
if (repositoryType.equals(ERepositoryCategoryType.EBCDIC.getName())) {
return ERepositoryObjectType.METADATA_FILE_EBCDIC;
}
if (repositoryType.equals(ERepositoryCategoryType.MDM.getName())) {
return ERepositoryObjectType.METADATA_MDMCONNECTION;
}
if (repositoryType.equals(ERepositoryCategoryType.FTP.getName())) {
return ERepositoryObjectType.METADATA_FILE_FTP;
}
if (repositoryType.equals(ERepositoryCategoryType.BRMS.getName())) {
return ERepositoryObjectType.METADATA_FILE_BRMS;
}
if (repositoryType.equals(ERepositoryCategoryType.HL7.getName())) {
return ERepositoryObjectType.METADATA_FILE_HL7;
}
// added by hyWang
if (repositoryType.equals(ERepositoryCategoryType.RULE.getName())) {
return ERepositoryObjectType.METADATA_FILE_RULES;
}
if (repositoryType.equals(ERepositoryCategoryType.VALIDATIONRULES.getName())) {
return ERepositoryObjectType.METADATA_VALIDATION_RULES;
}
if (repositoryType.equals(ERepositoryCategoryType.EDIFACT.getName())) {
return ERepositoryObjectType.METADATA_EDIFACT;
}
// http://jira.talendforge.org/browse/TESB-5218 LiXiaopeng
if (repositoryType.equals("SERVICES:OPERATION") || repositoryType.equals("WEBSERVICE")) { //$NON-NLS-1$
if (GlobalServiceRegister.getDefault().isServiceRegistered(IESBService.class)) {
IESBService service = (IESBService) GlobalServiceRegister.getDefault().getService(IESBService.class);
return service.getServicesType();
}
}
for (IDragAndDropServiceHandler handler : DragAndDropManager.getHandlers()) {
if (handler.getType(repositoryType) != null) {
return handler.getType(repositoryType);
}
}
return null;
}
public boolean isSelectionValid(RepositoryNode node) {
// only for item
IRepositoryViewObject object = node.getObject();
if (object != null && object.getProperty().getItem() != null) {
return true;
}
return false;
}
public boolean isHidenTypeSelection() {
return this.hidenTypeSelection;
}
public void setHidenTypeSelection(boolean hidenTypeSelection) {
this.hidenTypeSelection = hidenTypeSelection;
}
public boolean isHeaderButton() {
return this.isHeaderButton;
}
public void setHeaderButton(boolean isHeaderButton) {
this.isHeaderButton = isHeaderButton;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
final String repositoryType = getRepositoryType();
if (node == null) {
return false;
}
if (node.getContentType() == ERepositoryObjectType.REFERENCED_PROJECTS) {
return true;
}
// ProjectManager pManager = ProjectManager.getInstance();
// if (!pManager.isInCurrentMainProject(node)) {
// for sub folders
if (node.getType() == ENodeType.STABLE_SYSTEM_FOLDER) {
return false;
}
// for Db Connections
if (node.getType() == ENodeType.SYSTEM_FOLDER) {
return true;
}
// }
IRepositoryViewObject object = node.getObject();
if (object == null || object.getProperty().getItem() == null) {
return false;
}
if (object instanceof MetadataTable) {
return false;
}
Item item = object.getProperty().getItem();
if (item instanceof FolderItem) {
return true;
}
if (item instanceof ConnectionItem) {
ConnectionItem connectionItem = (ConnectionItem) item;
Connection connection = connectionItem.getConnection();
// tAdvancedFileOutputXML
if (repositoryType != null && repositoryType.equals(ERepositoryCategoryType.XMLOUTPUT.getName())) {
if (connection instanceof XmlFileConnection && ((XmlFileConnection) connection).isInputModel()) {
return false;
}
}
if (repositoryType.startsWith(ERepositoryCategoryType.DATABASE.getName())) {
String currentDbType = (String) RepositoryToComponentProperty.getValue(connection, "TYPE", null); //$NON-NLS-1$
if (repositoryType.contains(":")) { // database //$NON-NLS-1$
// is
// specified
// //$NON-NLS-1$
String neededDbType = repositoryType.substring(repositoryType.indexOf(":") + 1); //$NON-NLS-1$
if (hidenTypeSelection) {
return true;
}
if (!MetadataTalendType.sameDBProductType(neededDbType, currentDbType)) {
return false;
}
}
}
}
if (repositoryType.startsWith(ERepositoryCategoryType.HEADERFOOTER.getName())) {
if (item instanceof HeaderFooterConnectionItem) {
HeaderFooterConnectionItem connectionItem = (HeaderFooterConnectionItem) item;
HeaderFooterConnection connection = (HeaderFooterConnection) connectionItem.getConnection();
boolean isHeader = connection.isIsHeader();
if ((isHeader && isHeaderButton) || (!isHeader && !isHeaderButton)) {
return true;
} else {
return false;
}
}
}
return true;
}
}
/**
* bqian TypeProcessor for Schema. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
class SchemaTypeProcessor extends MultiTypesProcessor {
/**
* DOC bqian RepositoryTypeProcessor constructor comment.
*
* @param repositoryType
*/
public SchemaTypeProcessor(String repositoryType) {
super(new String[] { repositoryType });
}
protected String getRepositoryType() {
return getRepositoryTypes()[0];
}
@Override
protected List<ERepositoryObjectType> getTypes() {
List<ERepositoryObjectType> list = new ArrayList<ERepositoryObjectType>(50);
String repositoryType = getRepositoryType();
if (repositoryType != null && repositoryType.startsWith(ERepositoryCategoryType.DATABASE.getName())) {
list.add(ERepositoryObjectType.METADATA_CONNECTIONS);
} else {
list.add(ERepositoryObjectType.METADATA_CONNECTIONS);
list.add(ERepositoryObjectType.METADATA_FILE_DELIMITED);
list.add(ERepositoryObjectType.METADATA_FILE_POSITIONAL);
list.add(ERepositoryObjectType.METADATA_FILE_REGEXP);
list.add(ERepositoryObjectType.METADATA_FILE_XML);
list.add(ERepositoryObjectType.METADATA_FILE_LDIF);
list.add(ERepositoryObjectType.METADATA_FILE_EXCEL);
list.add(ERepositoryObjectType.METADATA_FILE_HL7);
list.add(ERepositoryObjectType.METADATA_FILE_EBCDIC);
list.add(ERepositoryObjectType.METADATA_FILE_FTP);
list.add(ERepositoryObjectType.METADATA_FILE_BRMS);
list.add(ERepositoryObjectType.METADATA_GENERIC_SCHEMA);
list.add(ERepositoryObjectType.METADATA_LDAP_SCHEMA);
list.add(ERepositoryObjectType.METADATA_WSDL_SCHEMA);
list.add(ERepositoryObjectType.METADATA_SALESFORCE_SCHEMA);
list.add(ERepositoryObjectType.METADATA_SAPCONNECTIONS);
list.add(ERepositoryObjectType.METADATA_RULES_MANAGEMENT);
list.add(ERepositoryObjectType.METADATA_MDMCONNECTION);
list.add(ERepositoryObjectType.METADATA_EDIFACT);
}
return list;
}
public boolean isSelectionValid(RepositoryNode node) {
if (node.getObject() instanceof MetadataTable || node.getObject() instanceof SAPFunctionRepositoryObject) {
return true;
}
return false;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (super.selectRepositoryNode(viewer, parentNode, node)) {
IRepositoryViewObject object = node.getObject();
if (object != null) {
// query
if (object instanceof Query) {
return false;
}
}
// cdc
ICDCProviderService cdcService = null;
if (PluginChecker.isCDCPluginLoaded()) {
cdcService = (ICDCProviderService) GlobalServiceRegister.getDefault().getService(ICDCProviderService.class);
}
String repositoryType = getRepositoryType();
if (ERepositoryCategoryType.CDC.getName().equals(repositoryType) && (object != null)) {
if (object.getRepositoryObjectType() == ERepositoryObjectType.METADATA_CONNECTIONS) {
DatabaseConnectionItem item = (DatabaseConnectionItem) object.getProperty().getItem();
DatabaseConnection connection = (DatabaseConnection) item.getConnection();
if (cdcService != null && cdcService.canCreateCDCConnection(connection)) {
return true;
}
return false;
}
if (object instanceof MetadataTable) {
return ((MetadataTableRepositoryObject) object).getTable().isActivatedCDC();
}
}
return true;
}
return false;
}
}
/**
* xye TypeProcessor for Query. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
class SAPFunctionProcessor extends SingleTypeProcessor {
/**
* bqian RepositoryTypeProcessor constructor comment.
*
* @param repositoryType
*/
public SAPFunctionProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.METADATA_SAPCONNECTIONS;
}
public boolean isSelectionValid(RepositoryNode node) {
if (node.getObject().getRepositoryObjectType() == ERepositoryObjectType.METADATA_SAP_FUNCTION) {
return true;
}
return false;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (node.getObject() != null && (node.getObject() instanceof MetadataTable)) {
return false;
}
return true;
}
}
// //
/**
* DOC zli class global comment. Detailled comment
*/
class HeaderFooterTypeProcessor extends SingleTypeProcessor {
/**
* DOC zli HeaderFooterTypeProcessor constructor comment.
*
* @param repositoryType
*/
public HeaderFooterTypeProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.METADATA_HEADER_FOOTER;
}
}
// ////////////
// //
/**
* xye class global comment. Detailled comment
*/
class ContextTypeProcessor extends SingleTypeProcessor {
/**
* xye RepositoryTypeProcessor constructor comment.
*
* @param repositoryType
*/
public ContextTypeProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.CONTEXT;
}
}
/**
* bqian TypeProcessor for Query. <br/>
*
* $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (ææäº, 29 ä¹æ 2006) nrousseau $
*
*/
class QueryTypeProcessor extends SingleTypeProcessor {
/**
* bqian RepositoryTypeProcessor constructor comment.
*
* @param repositoryType
*/
public QueryTypeProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.METADATA_CONNECTIONS;
}
public boolean isSelectionValid(RepositoryNode node) {
if (node.getObject() instanceof Query) {
return true;
}
return false;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (node.getObject() != null && (node.getObject() instanceof MetadataTable)) {
return false;
}
if (isCDCConnection(node)) {
return false;
}
return true;
}
}
/**
* DOC ycbai class global comment. Detailled comment
*/
class ValidationRuleTypeProcessor extends SingleTypeProcessor {
/**
* DOC ycbai ValidationRuleTypeProcessor constructor comment.
*
* @param repositoryType
*/
public ValidationRuleTypeProcessor(String repositoryType) {
super(repositoryType);
}
@Override
protected ERepositoryObjectType getType() {
return ERepositoryObjectType.METADATA_VALIDATION_RULES;
}
@Override
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (node.getContentType() == ERepositoryObjectType.REFERENCED_PROJECTS) {
return true;
}
ProjectManager pManager = ProjectManager.getInstance();
if (!pManager.isInCurrentMainProject(node)) {
if (node.getType() == ENodeType.STABLE_SYSTEM_FOLDER) {
return false;
}
if (node.getType() == ENodeType.SYSTEM_FOLDER) {
return true;
}
}
if (node.getType() == ENodeType.SYSTEM_FOLDER) {
return true;
}
if (node.getObject() == null || node.getObject().getProperty().getItem() == null) {
return false;
}
if (node.getObject() instanceof MetadataTable) {
return false;
}
Item item = node.getObject().getProperty().getItem();
if (item instanceof FolderItem) {
return true;
}
if (node.getObjectType() == getType()) {
return true;
}
return false;
}
}
/**
*
* DOC talend class global comment. Detailled comment
*/
class MetadataMultiTypeProcessor extends MultiTypesProcessor {
public MetadataMultiTypeProcessor(String[] repositoryTypes) {
super(repositoryTypes);
}
@Override
protected List<ERepositoryObjectType> getTypes() {
List<ERepositoryObjectType> types = new ArrayList<ERepositoryObjectType>();
String[] repositoryTypes = getRepositoryTypes();
if (repositoryTypes != null) {
for (int i = 0; i < repositoryTypes.length; i++) {
if (ERepositoryCategoryType.XML.getName().equals(repositoryTypes[i])) {
types.add(ERepositoryObjectType.METADATA_FILE_XML);
} else if (ERepositoryCategoryType.MDM.getName().equals(repositoryTypes[i])) {
types.add(ERepositoryObjectType.METADATA_MDMCONNECTION);
}
}
}
return types;
}
protected boolean selectRepositoryNode(Viewer viewer, RepositoryNode parentNode, RepositoryNode node) {
if (super.selectRepositoryNode(viewer, parentNode, node)) {
IRepositoryViewObject object = node.getObject();
if (object != null) {
// query
if (object instanceof Query) {
return false;
}
}
return true;
}
return false;
}
public String getDialogTitle() {
return Messages.getString("RepositoryReviewDialog.metadataTitle"); //$NON-NLS-1$
}
}
/**
* bqian class global comment. Detailled comment
*/
class ViewerTextFilter extends ViewerFilter {
private String text = null;
public void setText(String text) {
this.text = text;
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (text == null || text.equals("")) { //$NON-NLS-1$
return true;
}
RepositoryNode node = (RepositoryNode) element;
ENodeType nodeType = node.getType();
if (nodeType != ENodeType.REPOSITORY_ELEMENT) {
List<IRepositoryNode> children = node.getChildren();
if (children.isEmpty()) {
return false;
}
for (IRepositoryNode child : children) {
if (select(viewer, null, child)) {
return true;
}
}
return false;
}
final IRepositoryViewObject object = node.getObject();
if (object != null) {
String name = object.getProperty().getLabel();
if (name != null) {
return name.matches(text);
}
}
return true; // always
}
}
/**
* wchen class global comment. Detailled comment
*/
class DatabaseTypeFilter extends ViewerFilter {
private String[] filterItems;
public DatabaseTypeFilter(String[] filterItems) {
this.filterItems = filterItems;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
return isSupportNode((RepositoryNode) element, filterItems);
}
private boolean isSupportNode(IRepositoryNode node, String[] items) {
if (filterItems == null) {
return true;
}
List<String> asList = Arrays.asList(items);
if (node.getObject() == null) {
if (node.getType() == ENodeType.REFERENCED_PROJECT || node.getType() == ENodeType.SYSTEM_FOLDER) {
return true;
}
} else {
Item item = node.getObject().getProperty().getItem();
if (item instanceof DatabaseConnectionItem) {
DatabaseConnectionItem connItem = (DatabaseConnectionItem) item;
DatabaseConnection connection = (DatabaseConnection) connItem.getConnection();
if (connection != null) {
String databaseType = connection.getDatabaseType();
if (databaseType.equals(EDatabaseTypeName.ORACLEFORSID.getDisplayName())) {
databaseType = EDatabaseTypeName.ORACLEFORSID.getXmlName();
} else if (databaseType.equals(EDatabaseTypeName.ORACLESN.getDisplayName())) {
databaseType = EDatabaseTypeName.ORACLESN.getXmlName();
} else if (databaseType.equals(EDatabaseTypeName.ORACLE_OCI.getDisplayName())) {
databaseType = EDatabaseTypeName.ORACLE_OCI.getXmlName();
} else if (databaseType.equals(EDatabaseTypeName.MSSQL.getDisplayName())) {
databaseType = EDatabaseTypeName.MSSQL.getXmlName(); // for component
} else {
databaseType = EDatabaseTypeName.getTypeFromDbType(databaseType).getProduct();
}
if (asList.contains(databaseType)) {
return true;
}
}
} else if (item instanceof FolderItem) {
return true;
}
}
return false;
}
}