/******************************************************************************* * Copyright © 2010, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.rui.visualeditor.internal.wizards.insertwidget; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.edt.ide.rui.visualeditor.internal.widget.DataTemplate; import org.eclipse.edt.ide.rui.visualeditor.internal.widget.WidgetDescriptorRegistry; import org.eclipse.edt.ide.rui.visualeditor.internal.wizards.util.NameFinder; import org.eclipse.edt.ide.rui.visualeditor.plugin.Activator; public class InsertDataNode { private InsertDataNode parent; private List<InsertDataNode> children; private InsertDataModel model; //for widget template mapping private String nodeType; private Set<String> nodeTypeDetails; private boolean isArray; private boolean isContainer; private String purpose; //for generation private String bindingName; private boolean isGen; private List<DataTemplate> dataTemplates; private List<DataTemplate> forDisplayDataTemplates; private List<DataTemplate> forCreateDataTemplates; private List<DataTemplate> forUpdateDataTemplates; //for display in the wizard private String fieldName; private String fieldType; private String labelText; private WidgetType widgetType; private WidgetType[] widgetTypes; private WidgetType[] forDisplayWidgetTypes; private WidgetType[] forCreateWidgetTypes; private WidgetType[] forUpdateWidgetTypes; private String widgetName; public InsertDataNode(InsertDataModel model, String bindingName, String fieldType){ this.model = model; this.children = new ArrayList<InsertDataNode>(); this.bindingName = bindingName; this.fieldType = fieldType; this.nodeTypeDetails = new HashSet<String>(); this.purpose = Purpose.FOR_DISPLAY; createFieldName(); } private void createFieldName(){ if(bindingName.contains(".")){ fieldName = bindingName.substring(bindingName.lastIndexOf(".")+1, bindingName.length()); }else{ fieldName = bindingName; } } public InsertDataModel getModel() { return model; } public String getBindingName() { return bindingName; } public void setBindingName(String bindingName) { this.bindingName = bindingName; } public InsertDataNode getParent() { return parent; } public void setParent(InsertDataNode parent) { this.parent = parent; } public List<InsertDataNode> getChildren() { return children; } public void addChild(InsertDataNode child){ this.children.add(child); child.setParent(this); } public boolean hasChildren(){ return !children.isEmpty(); } public void setChildren(List<InsertDataNode> children){ this.children = children; } public String getNodeType() { return nodeType; } public void setNodeType(String nodeType) { this.nodeType = nodeType; } public boolean isGen() { return isGen; } public void setGen(boolean isGen) { this.isGen = isGen; } public Set<String> getNodeTypeDetails() { return nodeTypeDetails; } public void addNodeTypeDetail(String nodeTypeDetail) { if(nodeTypeDetail != null){ nodeTypeDetails.add(nodeTypeDetail); } } public void removeNodeTypeDetail(String nodeTypeDetail){ nodeTypeDetails.remove(nodeTypeDetail); } public boolean isArray() { return isArray; } public void setArray(boolean isArray) { this.isArray = isArray; } public boolean isContainer() { return isContainer; } public void setContainer(boolean isContainer) { this.isContainer = isContainer; } public String getFieldName() { return fieldName; } public void setFieldName(String fieldName) { this.fieldName = fieldName; } public String getFieldType() { return fieldType; } public void setFieldType(String fieldType) { this.fieldType = fieldType; } public String getLabelText() { if(labelText == null){ int lastIndex = bindingName.lastIndexOf("."); if(lastIndex == -1){ labelText = bindingName; }else{ labelText = bindingName.substring(lastIndex+1); } } return labelText; } public void setLabelText(String labelText) { this.labelText = labelText; } public String getPurpose() { return purpose; } public void setPurpose(String purpose) { this.purpose = purpose; } public void update(){ widgetTypes = null; widgetType = null; } public WidgetType[] getWidgetTypes(){ boolean isTimeStamp = fieldType.equalsIgnoreCase("timestamp(\"HHmmss\")") || fieldType.equalsIgnoreCase("timestamp(\"yyyyMMddHHmmss\")") || fieldType.equalsIgnoreCase("timestamp"); if(purpose.equals(InsertDataNode.Purpose.FOR_DISPLAY)){ if(forDisplayWidgetTypes == null){ forDisplayDataTemplates = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, nodeType, nodeTypeDetails, isArray, isContainer); if(isTimeStamp){ //Copy the DataTemplate of TYPE_PRIMITIVE_TIME, and add to the DataTemplate list. Set<String> timeNodeTypeDetails = new HashSet<String>(); timeNodeTypeDetails.add(NodeTypeDetail.TYPE_PRIMITIVE_TIME); List<DataTemplate> dataTemplatesTime = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, null, timeNodeTypeDetails, isArray, isContainer); for(DataTemplate dataTemplate : dataTemplatesTime){ if(dataTemplate.getName().equals("DojoTimeTextBox (read only)")){ forDisplayDataTemplates.add(dataTemplate); } } } forDisplayWidgetTypes = new WidgetType[forDisplayDataTemplates.size()]; for(int i=0; i<forDisplayWidgetTypes.length; i++){ DataTemplate dataTemplate = forDisplayDataTemplates.get(i); WidgetType widgetType = new WidgetType(dataTemplate.getName(), dataTemplate.getWidgetDescriptor().getType()); forDisplayWidgetTypes[i] = widgetType; } } dataTemplates = forDisplayDataTemplates; widgetTypes = forDisplayWidgetTypes; } if(purpose.equals(InsertDataNode.Purpose.FOR_CREATE)){ if(forCreateWidgetTypes == null){ forCreateDataTemplates = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, nodeType, nodeTypeDetails, isArray, isContainer); if(isTimeStamp){ //Copy the DataTemplate of TYPE_PRIMITIVE_TIME, and add to the DataTemplate list. Set<String> timeNodeTypeDetails = new HashSet<String>(); timeNodeTypeDetails.add(NodeTypeDetail.TYPE_PRIMITIVE_TIME); List<DataTemplate> dataTemplatesTime = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, null, timeNodeTypeDetails, isArray, isContainer); for(DataTemplate dataTemplate : dataTemplatesTime){ if(dataTemplate.getName().equals("DojoTimeTextBox")){ forCreateDataTemplates.add(dataTemplate); } } } forCreateWidgetTypes = new WidgetType[forCreateDataTemplates.size()]; for(int i=0; i<forCreateWidgetTypes.length; i++){ DataTemplate dataTemplate = forCreateDataTemplates.get(i); WidgetType widgetType = new WidgetType(dataTemplate.getName(), dataTemplate.getWidgetDescriptor().getType()); forCreateWidgetTypes[i] = widgetType; } } dataTemplates = forCreateDataTemplates; widgetTypes = forCreateWidgetTypes; } if(purpose.equals(InsertDataNode.Purpose.FOR_UPDATE)){ if(forUpdateWidgetTypes == null){ forUpdateDataTemplates = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, nodeType, nodeTypeDetails, isArray, isContainer); if(isTimeStamp){ Set<String> timeNodeTypeDetails = new HashSet<String>(); timeNodeTypeDetails.add(NodeTypeDetail.TYPE_PRIMITIVE_TIME); List<DataTemplate> dataTemplatesTime = WidgetDescriptorRegistry.getInstance(model.getProject()).getMappingDescriptorDataTemplates(purpose, null, timeNodeTypeDetails, isArray, isContainer); for(DataTemplate dataTemplate : dataTemplatesTime){ if(dataTemplate.getName().equals("DojoTimeTextBox") || dataTemplate.getName().equals("DojoTimeTextBox (read only)")){ forUpdateDataTemplates.add(dataTemplate); } } } forUpdateWidgetTypes = new WidgetType[forUpdateDataTemplates.size()]; for(int i=0; i<forUpdateWidgetTypes.length; i++){ DataTemplate dataTemplate = forUpdateDataTemplates.get(i); WidgetType widgetType = new WidgetType(dataTemplate.getName(), dataTemplate.getWidgetDescriptor().getType()); forUpdateWidgetTypes[i] = widgetType; } } dataTemplates = forUpdateDataTemplates; widgetTypes = forUpdateWidgetTypes; } WidgetType defaultWidgetType = getDefaultWidgetType(); if(defaultWidgetType != null){ for(int i=0; i<widgetTypes.length; i++){ if(widgetTypes[i].getName().equalsIgnoreCase(defaultWidgetType.getName())){ widgetTypes[i] = widgetTypes[0]; widgetTypes[0] = defaultWidgetType; } } } return widgetTypes; } public WidgetType getDefaultWidgetType() { WidgetType defaultWidgetType = null; String defaultWidgetTypeName = Activator.getDefault().getPreferenceStore().getString(bindingName + purpose); if(defaultWidgetTypeName == null || defaultWidgetTypeName.equals("")){ for(DataTemplate dataTemplate : dataTemplates){ if(dataTemplate.getDataMapping().isDefault()){ defaultWidgetType = new WidgetType(dataTemplate.getName(), dataTemplate.getWidgetDescriptor().getType()); break; }; } }else{ for(DataTemplate dataTemplate : dataTemplates){ if(defaultWidgetTypeName.equalsIgnoreCase(dataTemplate.getName())){ defaultWidgetType = new WidgetType(dataTemplate.getName(), dataTemplate.getWidgetDescriptor().getType()); break; }; } } return defaultWidgetType; } public DataTemplate getDataTemplate(){ for(DataTemplate dataTemplate : dataTemplates){ if(dataTemplate.getName().equals(widgetType.getName())){ return dataTemplate; } } return null; } public WidgetType getWidgetType(){ if(widgetTypes == null){ getWidgetTypes(); if(widgetTypes.length == 0){ widgetType = new WidgetType(RUIWidgetType.NONE, RUIWidgetType.NONE); }else{ widgetType = widgetTypes[0]; } } return widgetType; } public void setWidgetType(WidgetType widgetType) { this.widgetType = widgetType; } public String getWidgetName() { return widgetName; } public void setWidgetName(String widgetName) { this.widgetName = widgetName; } public String getDefaultWidgetName(){ String defaultWidgetName; int i = 0; String tempWidgetName = bindingName.replace(".", "_") + "_" + getShortWidgetType(); defaultWidgetName = tempWidgetName; while(isFieldNameExist(defaultWidgetName)){ i++; defaultWidgetName = tempWidgetName + i; } return defaultWidgetName; } private String getShortWidgetType(){ String shortWidgetType; if(parent == null){ shortWidgetType = "ui"; }else{ WidgetType widgetType = getWidgetType(); String widgetTypeType = widgetType.getType(); List<String> widgetTypeShortNames = new ArrayList<String>(); for(int i=0; i<widgetTypeType.length(); i++){ char character = widgetTypeType.charAt(i); if(character>='A' && character<='Z'){ String widgetTypeShortName = widgetTypeType.substring(i); widgetTypeShortNames.add(widgetTypeShortName); } } shortWidgetType = widgetTypeShortNames.get(widgetTypeShortNames.size()-1).toLowerCase(); if(shortWidgetType.equals("box")){ shortWidgetType = widgetTypeShortNames.get(widgetTypeShortNames.size()-2); char ch= Character.toLowerCase(shortWidgetType.charAt(0)); shortWidgetType = ch + shortWidgetType.substring(1, shortWidgetType.length()); } } return shortWidgetType; } private boolean isFieldNameExist(String fieldName){ if(NameFinder.getInstance().isFieldNameExist(fieldName) || isFieldNameExistInInsertWidgetModel(fieldName)){ return true; } return false; } private boolean isFieldNameExistInInsertWidgetModel(String widgetName){ List<InsertDataNode> roots = model.getRootDataNodes(); for(InsertDataNode root : roots){ return isFieldNameExistInInsertWidgetModel(root, widgetName); } return false; } private boolean isFieldNameExistInInsertWidgetModel(InsertDataNode parent, String widgetName){ if(parent.equals(this)){ return false; } if(parent.getWidgetName() == null){ if(parent.getDefaultWidgetName().equalsIgnoreCase(widgetName)){ return true; } }else{ if(parent.getWidgetName().equalsIgnoreCase(widgetName)){ return true; } } List<InsertDataNode> children = parent.getChildren(); for(InsertDataNode child : children){ return isFieldNameExistInInsertWidgetModel(child, widgetName); } return false; } public class Purpose{ public static final String FOR_DISPLAY = "FOR_DISPLAY"; public static final String FOR_CREATE = "FOR_CREATE"; public static final String FOR_UPDATE = "FOR_UPDATE"; } public class NodeType{ public static final String TYPE_PRIMITIVE_ALL = "TYPE_PRIMITIVE_ALL"; public static final String TYPE_RECORD_ALL = "TYPE_RECORD_ALL"; } public class NodeTypeDetail{ public static final String TYPE_PRIMITIVE_STRING = "TYPE_PRIMITIVE_STRING"; public static final String TYPE_PRIMITIVE_DATE = "TYPE_PRIMITIVE_DATE"; public static final String TYPE_PRIMITIVE_TIME = "TYPE_PRIMITIVE_TIME"; public static final String TYPE_PRIMITIVE_TIMESTAMP = "TYPE_PRIMITIVE_TIMESTAMP"; public static final String TYPE_PRIMITIVE_BIGINT = "TYPE_PRIMITIVE_BIGINT"; public static final String TYPE_PRIMITIVE_BIN = "TYPE_PRIMITIVE_BIN"; public static final String TYPE_PRIMITIVE_DECIMAL = "TYPE_PRIMITIVE_DECIMAL"; public static final String TYPE_PRIMITIVE_FLOAT = "TYPE_PRIMITIVE_FLOAT"; public static final String TYPE_PRIMITIVE_INT = "TYPE_PRIMITIVE_INT"; public static final String TYPE_PRIMITIVE_NUM = "TYPE_PRIMITIVE_NUM"; public static final String TYPE_PRIMITIVE_MONEY = "TYPE_PRIMITIVE_MONEY"; public static final String TYPE_PRIMITIVE_SMALLINT = "TYPE_PRIMITIVE_SMALLINT"; public static final String TYPE_PRIMITIVE_SMALLFLOAT = "TYPE_PRIMITIVE_SMALLFLOAT"; public static final String TYPE_PRIMITIVE_BOOLEAN = "TYPE_PRIMITIVE_BOOLEAN"; public static final String TYPE_RECORD_SIMPLE = "TYPE_RECORD_SIMPLE"; public static final String TYPE_RECORD_EMBED_RECORD = "TYPE_RECORD_EMBED_RECORD"; public static final String TYPE_RECORD_WITH_PRIMITIVE_ARRAY = "TYPE_RECORD_WITH_PRIMITIVE_ARRAY"; public static final String TYPE_RECORD_WITH_RECORD_ARRAY = "TYPE_RECORD_WITH_RECORD_ARRAY"; } public class RUIWidgetType{ public static final String NONE = "None"; } }