diff --git a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/data/FunctionManagerExt.java b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/data/FunctionManagerExt.java
index 278475a5063..03db5d91177 100644
--- a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/data/FunctionManagerExt.java
+++ b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/data/FunctionManagerExt.java
@@ -20,9 +20,13 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import org.talend.commons.exception.ExceptionHandler;
import org.talend.designer.rowgenerator.RowGeneratorComponent;
import org.talend.designer.rowgenerator.managers.UIManager;
import org.talend.designer.rowgenerator.ui.editor.MetadataColumnExt;
+import org.talend.utils.json.JSONArray;
+import org.talend.utils.json.JSONException;
+import org.talend.utils.json.JSONObject;
/**
* class global comment. Detailled comment
@@ -112,6 +116,35 @@ public class FunctionManagerExt extends FunctionManager {
return arrayTalendFunctions2;
}
+ public Function getFunctionFromColumn(MetadataColumnExt column) {
+ Function function = null;
+ String functionInfo = column.getFunctionInfo();
+ if (functionInfo != null) {
+ try {
+ JSONObject functionObj = new JSONObject(functionInfo);
+ String functionName = functionObj.getString(Function.NAME);
+ int functionSize = 0;
+ JSONArray parametersArray = functionObj.getJSONArray(Function.PARAMETERS);
+ if (parametersArray != null) {
+ functionSize = parametersArray.length();
+ }
+ List funcs = getFunctionsByType(column.getTalendType());
+ for (Function func : funcs) {
+ if (func.getName().equals(functionName) && func.getParameters().size() == functionSize) {
+ function = func;
+ break;
+ }
+ }
+ if (function != null) {
+ function = function.clone(parametersArray);
+ }
+ } catch (JSONException e) {
+ ExceptionHandler.process(e);
+ }
+ }
+ return function;
+ }
+
public Function getFuntionFromArray(MetadataColumnExt bean, RowGeneratorComponent externalNode, int index) {
String value = externalNode.getColumnValue(bean, index);
List functions = getFunctionsByType(bean.getTalendType());
diff --git a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/managers/UIManager.java b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/managers/UIManager.java
index 0459e8bb58d..0f93fb3ac69 100644
--- a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/managers/UIManager.java
+++ b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/managers/UIManager.java
@@ -240,7 +240,11 @@ public class UIManager {
List funs = functionManager.getFunctionsByType(ext.getTalendType());
ext.setArrayFunctions(functionManager.getFunctionArrays(funs));
if (!funs.isEmpty()) {
- ext.setFunction(functionManager.getFuntionFromArray(ext, externalNode, j));
+ Function funtion = functionManager.getFunctionFromColumn(ext);
+ if (funtion == null) {
+ funtion = functionManager.getFuntionFromArray(ext, externalNode, j);
+ }
+ ext.setFunction(funtion);
}
exts.add(ext);
}
diff --git a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExt.java b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExt.java
index a0f1c9373ee..e09971a06c9 100644
--- a/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExt.java
+++ b/main/plugins/org.talend.designer.rowgenerator/src/main/java/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExt.java
@@ -14,10 +14,12 @@ package org.talend.designer.rowgenerator.ui.editor;
import java.util.List;
+import org.talend.commons.exception.ExceptionHandler;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.MetadataColumn;
import org.talend.designer.rowgenerator.data.Function;
import org.talend.designer.rowgenerator.data.Parameter;
+import org.talend.utils.json.JSONException;
/**
* qzhang class global comment. Detailled comment
@@ -27,6 +29,8 @@ import org.talend.designer.rowgenerator.data.Parameter;
*/
public class MetadataColumnExt extends MetadataColumn {
+ public static final String FUNCTION_INFO = "FUNCTION_INFO"; //$NON-NLS-1$
+
private boolean isChanged;
/**
@@ -51,9 +55,25 @@ public class MetadataColumnExt extends MetadataColumn {
public void setFunction(Function function) {
this.function = function;
+ updateFunctionInfo();
}
- @SuppressWarnings("unchecked")//$NON-NLS-1$
+ private void updateFunctionInfo() {
+ if (function != null) {
+ try {
+ String serializedFunction = function.toSerialized();
+ this.getAdditionalField().put(FUNCTION_INFO, serializedFunction);
+ } catch (JSONException e) {
+ ExceptionHandler.process(e);
+ }
+ }
+ }
+
+ public String getFunctionInfo() {
+ return this.getAdditionalField().get(FUNCTION_INFO);
+ }
+
+ @SuppressWarnings("unchecked")
public String getParameter() {
String currentPara = ""; //$NON-NLS-1$
if (this.function != null) {
diff --git a/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/data/FunctionManagerExtTest.java b/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/data/FunctionManagerExtTest.java
index f4889e67674..fcc810c6657 100644
--- a/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/data/FunctionManagerExtTest.java
+++ b/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/data/FunctionManagerExtTest.java
@@ -12,9 +12,8 @@
// ============================================================================
package org.talend.designer.rowgenerator.data;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -24,6 +23,8 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.talend.core.i18n.Messages;
+import org.talend.core.model.metadata.MetadataColumn;
+import org.talend.core.model.metadata.types.JavaTypesManager;
import org.talend.designer.rowgenerator.ui.editor.MetadataColumnExt;
/**
@@ -104,4 +105,21 @@ public class FunctionManagerExtTest {
return function;
}
+ @Test
+ public void testGetFuntionFromColumn() {
+ FunctionManagerExt functionManagerExt = new FunctionManagerExt();
+ MetadataColumn newColumn = new MetadataColumn();
+ newColumn.setLabel("newColumn"); //$NON-NLS-1$
+ newColumn.setTalendType(JavaTypesManager.STRING.getId());
+ MetadataColumnExt columnExt = new MetadataColumnExt(newColumn);
+ List funcs = functionManagerExt.getFunctionsByType(newColumn.getTalendType());
+ if (funcs.size() > 0) {
+ Function func = funcs.get(0);
+ columnExt.setFunction(func);
+ Function function = functionManagerExt.getFunctionFromColumn(columnExt);
+ assertEquals(func.getName(), function.getName());
+ assertEquals(func.getParameters().size(), function.getParameters().size());
+ }
+ }
+
}
diff --git a/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExtTest.java b/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExtTest.java
new file mode 100644
index 00000000000..dd321ec950f
--- /dev/null
+++ b/test/plugins/org.talend.designer.rowgenerator.test/src/org/talend/designer/rowgenerator/ui/editor/MetadataColumnExtTest.java
@@ -0,0 +1,35 @@
+// ============================================================================
+//
+// 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.ui.editor;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.talend.designer.rowgenerator.data.Function;
+
+/**
+ * created by ycbai on 2016年10月28日 Detailled comment
+ *
+ */
+public class MetadataColumnExtTest {
+
+ @Test
+ public void testSetFunction() {
+ MetadataColumnExt column = new MetadataColumnExt();
+ Function func = new Function();
+ func.setName("testFunc"); //$NON-NLS-1$
+ column.setFunction(func);
+ assertNotNull(column.getAdditionalField().get(MetadataColumnExt.FUNCTION_INFO));
+ }
+
+}