org.talend.designer.rowgenerator.RowGeneratorComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.designer.rowgenerator.RowGeneratorComponent.java

Source

// ============================================================================
//
// Copyright (C) 2006-2015 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.designer.rowgenerator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.talend.commons.exception.SystemException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.model.components.IODataComponent;
import org.talend.core.model.components.IODataComponentContainer;
import org.talend.core.model.genhtml.HTMLDocUtils;
import org.talend.core.model.metadata.ColumnNameChanged;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.metadata.MetadataColumn;
import org.talend.core.model.metadata.MetadataTable;
import org.talend.core.model.process.AbstractExternalNode;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.process.IComponentDocumentation;
import org.talend.core.model.process.IConnection;
import org.talend.core.model.process.IConnectionCategory;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.IExternalData;
import org.talend.core.model.process.Problem;
import org.talend.core.model.temp.ECodePart;
import org.talend.designer.codegen.ICodeGeneratorService;
import org.talend.designer.rowgenerator.data.Function;
import org.talend.designer.rowgenerator.data.FunctionManagerExt;
import org.talend.designer.rowgenerator.external.data.ExternalRowGenTable;
import org.talend.designer.rowgenerator.external.data.ExternalRowGeneratorData;
import org.talend.designer.rowgenerator.shadow.RowGenProcessMain;
import org.talend.designer.rowgenerator.ui.editor.MetadataColumnExt;
import org.talend.designer.rowgenerator.utils.problems.ProblemsAnalyser;

/**
 * This is the external component of rowGenerator component. <br/>
 * 
 * $Id: RowGeneratorComponent.java,v 1.12 2007/02/02 03:34:13 pub Exp $
 * 
 */
public class RowGeneratorComponent extends AbstractExternalNode {

    public static final String COLUMN_NAME = "SCHEMA_COLUMN"; //$NON-NLS-1$

    public static final String ARRAY = "ARRAY"; //$NON-NLS-1$

    private RowGenMain rowGeneratorMain;

    private List<IMetadataTable> metadataListOut;

    private ExternalRowGeneratorData externalData;

    private RowGenProcessMain codeGenMain;

    private String number;

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.AbstractExternalNode#initialize()
     */
    @Override
    public void initialize() {
        initRowGeneratorMain();
        rowGeneratorMain.loadInitialParamters();
        codeGenMain = new RowGenProcessMain(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.designer.core.model.components.IExternalComponent#getPersistentData()
     */
    @Override
    public IExternalData getExternalData() {
        return null;
    }

    private void initRowGeneratorMain() {
        rowGeneratorMain = new RowGenMain(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.designer.core.model.components.IExternalComponent#open(org.eclipse.swt.widgets.Display)
     */
    @Override
    public int open(final Display display) {
        initRowGeneratorMain();
        rowGeneratorMain.createModelFromExternalData(getIODataComponents(), getMetadataList(), externalData, true);
        Shell shell = rowGeneratorMain.createUI(display);
        while (!shell.isDisposed()) {
            try {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            } catch (Throwable e) {
                if (RowGenMain.isStandAloneMode()) {
                    e.printStackTrace();
                } else {
                    ExceptionHandler.process(e);
                }
            }
        }
        if (RowGenMain.isStandAloneMode()) {
            display.dispose();
        }
        rowGeneratorMain.buildExternalData();
        return rowGeneratorMain.getMapperDialogResponse();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.designer.core.model.components.IExternalComponent#open()
     */
    @Override
    public int open(final Composite parent) {
        initRowGeneratorMain();
        rowGeneratorMain.createModelFromExternalData(getIODataComponents(), getMetadataList(), externalData, true);
        Dialog dialog = rowGeneratorMain.createRowGeneratorDialog(parent.getShell());
        dialog.open();
        return rowGeneratorMain.getMapperDialogResponse();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.designer.core.model.components.IExternalComponent#setPersistentData(java.lang.Object)
     */
    @Override
    public void setExternalData(IExternalData externalData) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.INode#getGeneratedCode()
     */
    public String getGeneratedCode() {
        try {
            ICodeGeneratorService service = PluginUtils.getCodeGeneratorService();
            return service.createCodeGenerator().generateComponentCode(this, ECodePart.MAIN);
        } catch (SystemException e) {
            ExceptionHandler.process(e);
        }
        return ""; //$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.INode#getMetadataList()
     */
    @Override
    public List<IMetadataTable> getMetadataList() {
        return this.metadataListOut;
    }

    /*
     * add for bug TDI-26458 by fwang at 24 June,2013, need check update for functions.
     */
    private boolean sameMetadataFunctionsAs(IMetadataTable metaTable) {
        List<IMetadataColumn> metaTables = metaTable.getListColumns();
        for (IMetadataColumn metaColum : metaTables) {
            if (!(metaColum instanceof MetadataColumnExt)) {
                break;
            }
            MetadataColumnExt metaColumExt = (MetadataColumnExt) metaColum;
            String functionValue = FunctionManagerExt.getOneColData(metaColumExt);
            for (Map<String, Object> map : getMapList()) {
                if (metaColumExt.getLabel().equals(map.get(COLUMN_NAME)) && !functionValue.equals(map.get(ARRAY))) {
                    return false;
                }
            }
        }

        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.INode#setMetadataList(java.util.List)
     */
    @Override
    public void setMetadataList(List<IMetadataTable> metadataTablesOut) {
        boolean needUpdateMetadata = false;
        if (this.metadataListOut == null) {
            needUpdateMetadata = true;
        } else if (this.metadataListOut.size() != metadataTablesOut.size()) {
            needUpdateMetadata = true;
        } else {
            for (IMetadataTable metaTable : this.metadataListOut) {
                for (IMetadataTable externalMetaTable : metadataTablesOut) {
                    if (!metaTable.sameMetadataAs(externalMetaTable, IMetadataColumn.OPTIONS_NONE)
                            || !this.sameMetadataFunctionsAs(metaTable)) {
                        needUpdateMetadata = true;
                        break;
                    }
                }
                if (needUpdateMetadata) {
                    break;
                }
            }
        }
        if (needUpdateMetadata) {
            this.metadataListOut = metadataTablesOut;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.AbstractExternalNode#getProblems()
     */
    @Override
    public List<Problem> getProblems() {
        initRowGeneratorMain();
        ProblemsAnalyser problemsAnalyser = new ProblemsAnalyser(rowGeneratorMain.getRowGenManager());
        return problemsAnalyser.checkProblems(externalData);
    }

    public RowGenMain getRowGeneratorMain() {
        return this.rowGeneratorMain;
    }

    public RowGenProcessMain getCodeGenMain() {
        if (codeGenMain == null) {
            this.codeGenMain = new RowGenProcessMain(this);
        }
        return this.codeGenMain;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.AbstractExternalNode#renameMetadataColumnName(java.lang.String,
     * java.lang.String, java.lang.String)
     */
    @Override
    protected void renameMetadataColumnName(String conectionName, String oldColumnName, String newColumnName) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.IExternalNode#renameInputConnection(java.lang.String, java.lang.String)
     */
    @Override
    public void renameInputConnection(String oldName, String newName) {
        // do nothing, because tRowGenerator has not Input Connections.
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.IExternalNode#renameOutputConnection(java.lang.String, java.lang.String)
     */
    @Override
    public void renameOutputConnection(String oldName, String newName) {
        if (oldName == null || newName == null) {
            throw new NullPointerException();
        }
        if (externalData != null) {
            List<ExternalRowGenTable> outputTables = externalData.getOutputTables();
            for (ExternalRowGenTable table : outputTables) {
                if (table.getName().equals(oldName)) {
                    table.setName(newName);
                    break;
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    public String getNumber() {
        boolean end = false;
        List<IElementParameter> eps = (List<IElementParameter>) this.getElementParameters();
        if (eps == null) {
            return "10"; //$NON-NLS-1$
        }
        for (int i = 0; i < eps.size() && !end; i++) {
            IElementParameter parameter = eps.get(i);
            if ("__NB_ROWS__".indexOf(parameter.getVariableName()) != -1) { //$NON-NLS-1$
                this.number = (String) parameter.getValue();
                end = true;
            }
        }
        return this.number;
    }

    @SuppressWarnings("unchecked")
    public void setNumber(String number) {
        this.number = number;
        List<IElementParameter> eps = (List<IElementParameter>) this.getElementParameters();
        boolean end = false;
        for (int i = 0; i < eps.size() && !end; i++) {
            IElementParameter parameter = eps.get(i);
            if ("__NB_ROWS__".indexOf(parameter.getVariableName()) != -1) { //$NON-NLS-1$
                parameter.setValue(this.number);
                end = true;
            }
        }
    }

    @SuppressWarnings("unchecked")
    public List<Map<String, Object>> getMapList() {
        List<Map<String, Object>> map = new ArrayList<Map<String, Object>>();
        List<IElementParameter> eps = (List<IElementParameter>) this.getElementParameters();
        if (eps == null) {
            return map;
        }
        boolean end = false;
        for (int i = 0; i < eps.size() && !end; i++) {
            IElementParameter parameter = eps.get(i);
            if (parameter.getFieldType() == EParameterFieldType.TABLE) {
                map = (List<Map<String, Object>>) parameter.getValue();
                end = true;
            }
        }
        return map;
    }

    public void setColumnValue(String columnName, String value) {
        List<Map<String, Object>> map = getMapList();
        boolean isAdd = true;
        for (int i = 0; i < map.size(); i++) {
            Map<String, Object> line = map.get(i);
            if (line.get(COLUMN_NAME).equals(columnName)) {
                line.put(ARRAY, value);
                isAdd = false;
            }
        }
        if (isAdd) {
            Map<String, Object> l = new HashMap<String, Object>();
            l.put(COLUMN_NAME, columnName);
            l.put(ARRAY, value);
            map.add(l);
        }
        reinitColumnValues(map);
    }

    public void reinitColumnValues(List<Map<String, Object>> map) {
        MetadataTable tableExt = (MetadataTable) this.getMetadataList().get(0);
        List<String> columnNames = new ArrayList<String>();
        for (IMetadataColumn column : tableExt.getListColumns()) {
            columnNames.add(column.getLabel());
        }
        if (map.size() > tableExt.getListColumns().size()) {
            for (int i = 0; i < map.size(); i++) {
                Map<String, Object> line = map.get(i);
                if (!columnNames.contains(line.get(COLUMN_NAME))) {
                    map.remove(line);
                }
            }
        }
    }

    public String getColumnValue(IMetadataColumn ext, int index) {
        List<Map<String, Object>> map = getMapList();
        String arrayValue = ""; //$NON-NLS-1$
        if (map.size() > index) {
            arrayValue = (String) map.get(index).get(ARRAY);
            for (int i = 0; i < map.size(); i++) {
                Map<String, Object> line = map.get(i);
                if (ext.getLabel().equals(line.get(COLUMN_NAME))) {
                    arrayValue = (String) line.get(ARRAY);
                    break;
                }
            }
        }
        return arrayValue;
    }

    @SuppressWarnings("unchecked")
    public void setTableElementParameter(List<Map<String, Object>> epsl) {
        List<IElementParameter> eps = (List<IElementParameter>) this.getElementParameters();
        for (int i = 0; i < eps.size(); i++) {
            IElementParameter parameter = eps.get(i);
            if (parameter.getFieldType() == EParameterFieldType.TABLE) {
                List<Map<String, Object>> tableValues = epsl;
                ArrayList newValues = new ArrayList();
                for (Map<String, Object> map : tableValues) {
                    Map<String, Object> newMap = new HashMap<String, Object>();
                    newMap.putAll(map);
                    newValues.add(newMap);
                }
                parameter.setValue(newValues);
                break;
            }
        }
    }

    @Override
    public IODataComponentContainer getIODataComponents() {
        IODataComponentContainer inAndOut = new IODataComponentContainer();

        List<IODataComponent> outputs = inAndOut.getOuputs();
        for (IConnection currentConnection : getOutgoingConnections()) {
            if (currentConnection.getLineStyle().hasConnectionCategory(IConnectionCategory.DATA)) {
                IODataComponent component = new IODataComponent(currentConnection, metadataListOut.get(0));
                outputs.add(component);
            }
        }
        return inAndOut;

    }

    /*
     * (non-Javadoc)
     * 
     * @seeorg.talend.core.model.process.AbstractExternalNode#metadataOutputChanged(org.talend.core.model.components.
     * IODataComponent, java.lang.String)
     */
    @Override
    public void metadataOutputChanged(IODataComponent dataComponent, String connectionToApply) {
        List<Map<String, Object>> oldMap = getMapList();
        List<Map<String, Object>> newMap = new ArrayList<Map<String, Object>>();

        List<Map<String, Object>> notuseMap = new ArrayList<Map<String, Object>>();
        notuseMap.addAll(oldMap);

        List<ColumnNameChanged> newColumns = dataComponent.getNewMetadataColumns();
        for (ColumnNameChanged changed : newColumns) {
            if ("".equals(changed.getOldName())) { //$NON-NLS-1$
                Map<String, Object> map2 = new HashMap<String, Object>();
                map2.put(COLUMN_NAME, changed.getNewName());
                newMap.add(map2);
            }
        }

        List<ColumnNameChanged> removeColumns = dataComponent.getRemoveMetadataColumns();
        for (ColumnNameChanged changed : removeColumns) {
            if ("".equals(changed.getNewName())) { //$NON-NLS-1$
                for (Map<String, Object> map : oldMap) {
                    if (changed.getOldName().equals(map.get(COLUMN_NAME))) {
                        notuseMap.remove(map);
                        break;
                    }
                }
            }
        }

        List<ColumnNameChanged> columnNameChanged = dataComponent.getColumnNameChanged();
        for (ColumnNameChanged changed : columnNameChanged) {
            for (Map<String, Object> map : oldMap) {
                if (changed.getOldName().equals(map.get(COLUMN_NAME))) {
                    Map<String, Object> map2 = new HashMap<String, Object>();
                    map2.put(COLUMN_NAME, changed.getNewName());
                    map2.put(ARRAY, map.get(ARRAY));
                    newMap.add(map2);
                    notuseMap.remove(map);
                    break;
                }
            }
        }
        newMap.addAll(notuseMap);
        // for (IMetadataColumn column : metadataTable.getListColumns()) {
        // for (Map<String, Object> map : oldMap) {
        // if (column.getLabel().equals(map.get(COLUMN_NAME))) {
        // Map<String, Object> map2 = new HashMap<String, Object>();
        // map2.put(COLUMN_NAME, column.getLabel());
        // map2.put(ARRAY, map.get(ARRAY));
        // newMap.add(map2);
        // }
        // }
        // }
        setTableElementParameter(newMap);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.IExternalNode#getComponentDocumentation(java.lang.String, java.lang.String)
     */
    @Override
    public IComponentDocumentation getComponentDocumentation(String componentName, String tempFolderPath) {
        RowGeneratorComponentDocumentation componentDocumentation = new RowGeneratorComponentDocumentation();
        componentDocumentation.setComponentName(componentName);
        componentDocumentation.setTempFolderPath(tempFolderPath);
        componentDocumentation.setPreviewPicPath(HTMLDocUtils.getPreviewPicPath(this));
        componentDocumentation.setExternalNode(getExternalNode());

        // Added parameters, preview and functions value.
        for (IMetadataTable table : this.metadataListOut) {
            try {
                this.convert(table);
            } catch (Exception e) {
                // e.printStackTrace();
                ExceptionHandler.process(e);
            }
        }

        componentDocumentation.setMetadataListOut(this.metadataListOut);

        return componentDocumentation;
    }

    /**
     * Coverts <code>MetadataColumn</code> to <code>MetadataColumnExt</code>
     * 
     * @param metadataTable
     * @return
     */
    private void convert(IMetadataTable metadataTable) {
        List<IMetadataColumn> exts = new ArrayList<IMetadataColumn>();
        for (int j = 0; j < metadataTable.getListColumns().size(); j++) {
            IMetadataColumn column = metadataTable.getListColumns().get(j);
            if (column instanceof MetadataColumn) {
                MetadataColumnExt ext = new MetadataColumnExt((MetadataColumn) column);

                String columnValue = this.getColumnValue(ext, j);

                if (columnValue != null && columnValue.length() > 0)

                {
                    columnValue = columnValue.replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
                    columnValue = columnValue.substring(columnValue.lastIndexOf(".") + 1); //$NON-NLS-1$
                    Function function = new Function();
                    function.setName(columnValue);
                    ext.setFunction(function);
                }
                exts.add(ext);
            }
        }
        metadataTable.setListColumns(exts);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.core.model.process.IExternalNode#getTMapExternalData()
     */
    @Override
    public IExternalData getTMapExternalData() {
        // TODO Auto-generated method stub
        return null;
    }

}