// ============================================================================ // // 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 com.amalto.workbench.dialogs.datacontainer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.amalto.workbench.utils.Util; public class AutoIncrementHelper { private static final String TAG_KEY = "key"; //$NON-NLS-1$ private static final String TAG_VALUE = "value"; //$NON-NLS-1$ private static final String TAG_ENTRY = "entry"; //$NON-NLS-1$ private static final String DEFAULT_VALUE = "0"; //$NON-NLS-1$ public static Map<String, String> getCurrentValue(String autoIncrementRecordContent, Map<String, String> entityToKeys) throws Exception { if (autoIncrementRecordContent == null || autoIncrementRecordContent.trim().isEmpty() || entityToKeys == null || entityToKeys.isEmpty()) { return null; } Map<String, String> keyToEntities = new HashMap<String, String>(); Iterator<String> iterator = entityToKeys.keySet().iterator(); while (iterator.hasNext()) { String entity = iterator.next(); keyToEntities.put(entityToKeys.get(entity), entity); } Map<String, String> entityValues = new HashMap<String, String>(); Document doc = Util.parse(autoIncrementRecordContent); NodeList nodeLists = doc.getElementsByTagName(TAG_KEY); for (int i = 0; i < nodeLists.getLength(); i++) { Node item = nodeLists.item(i); String keyContent = item.getTextContent(); if (keyToEntities.keySet().contains(keyContent)) { NodeList nodeList = item.getParentNode().getChildNodes(); for (int j = 0; j < nodeList.getLength(); j++) { Node item2 = nodeList.item(j); if (item2.getNodeName().equals(TAG_VALUE)) { String valueContent = item2.getTextContent(); entityValues.put(keyToEntities.get(keyContent), valueContent); break; } } } } iterator = entityToKeys.keySet().iterator(); while(iterator.hasNext()) { String next = iterator.next(); if(!entityValues.containsKey(next)) { entityValues.put(next, DEFAULT_VALUE); } } return entityValues; } public static String updateValue(String xml, Map<String, String> keyvalues) throws Exception { Document doc = Util.parse(xml); List<String> allKeys = new LinkedList<String>(); NodeList nodeLists = doc.getElementsByTagName(TAG_KEY); for (int i = 0; i < nodeLists.getLength(); i++) { Node keyNode = nodeLists.item(i); String keyContent = keyNode.getTextContent(); allKeys.add(keyContent); } List<String> removeKeys = new LinkedList<String>();// need remove Iterator<String> iterator = keyvalues.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); if (keyvalues.get(key).equals(DEFAULT_VALUE)) { removeKeys.add(key); iterator.remove(); } } List<String> addKeys = new ArrayList<String>(keyvalues.keySet());// need add addKeys.removeAll(allKeys); List<String> updateKeys = new ArrayList<String>(keyvalues.keySet()); updateKeys.retainAll(allKeys); List<Node> removedEntryNodes = new LinkedList<Node>(); for (int i = 0; i < nodeLists.getLength(); i++) { Node keyNode = nodeLists.item(i); String keyContent = keyNode.getTextContent(); if (removeKeys.contains(keyContent)) { Node entryNode = keyNode.getParentNode(); removedEntryNodes.add(entryNode); } else if (updateKeys.contains(keyContent)) { NodeList nodeList = keyNode.getParentNode().getChildNodes(); for (int j = 0; j < nodeList.getLength(); j++) { Node item = nodeList.item(j); if (item.getNodeName().equals(TAG_VALUE)) { item.setTextContent(keyvalues.get(keyContent)); } } } } // for (Node node : removedEntryNodes) { doc.getDocumentElement().removeChild(node); } if (!addKeys.isEmpty()) { for (String key : addKeys) { addEntryNode(doc, key, keyvalues.get(key)); } } return Util.nodeToString(doc); } private static void addEntryNode(Document doc, String key, String value) { Element parentNode = doc.getDocumentElement(); Element entryElement = doc.createElement(TAG_ENTRY); Element keyElement = doc.createElement(TAG_KEY); keyElement.appendChild(doc.createTextNode(key)); Element valueElement = doc.createElement(TAG_VALUE); valueElement.appendChild(doc.createTextNode(value)); entryElement.appendChild(keyElement); entryElement.appendChild(valueElement); parentNode.appendChild(entryElement); } }