// ============================================================================ // // 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 org.talend.mdm.repository.ui.wizards.imports; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.talend.core.model.properties.ByteArray; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ReferenceFileItem; import org.talend.mdm.repository.model.mdmproperties.WSDataModelItem; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import com.amalto.workbench.utils.Util; /** * created by liusongbo on Apr 14, 2016 * */ public class DatamodelOperatorUpdator implements IOperatorUpdator { private static Logger log = Logger.getLogger(DatamodelOperatorUpdator.class); public boolean updateConditionOperator(Item item) { boolean modified = false; if(item != null && item instanceof WSDataModelItem) { WSDataModelItem modelItem = (WSDataModelItem) item; EList<ReferenceFileItem> resources = modelItem.getReferenceResources(); for (ReferenceFileItem fileItem : resources) { if (fileItem.getExtension().equals("xsd")) { //$NON-NLS-1$ ByteArray content = fileItem.getContent(); byte[] byteContent = content.getInnerContent(); String xsdSchema = updateOperator(byteContent); if (xsdSchema != null) { try { byteContent = xsdSchema.getBytes("utf-8"); //$NON-NLS-1$ content.setInnerContent(byteContent); modelItem.getWsDataModel().setXsdSchema(new String(byteContent, "utf-8")); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { log.error(e.getMessage(), e); } modified = true; } break; } } if (modified) { RepositoryResourceUtil.saveItem(item); } } return modified; } private String updateOperator(byte[] byteContent) { String result = null; if (byteContent != null) { boolean modified = false; try { DocumentBuilder documentBuilder = getDocumentBuilder(); InputSource source = new InputSource(new ByteArrayInputStream(byteContent)); Document document = documentBuilder.parse(source); NodeList appinfoTags = document.getElementsByTagName("xsd:appinfo"); //$NON-NLS-1$ int len = appinfoTags.getLength(); for (int i = 0; i < len; i++) { Node appItem = appinfoTags.item(i); Node sourceAttr = appItem.getAttributes().getNamedItem("source"); //$NON-NLS-1$ if (sourceAttr.getNodeValue().equals("X_ForeignKey_Filter")) { //$NON-NLS-1$ String content = appItem.getTextContent(); if (content.contains("Strict Contains") || content.contains("Contains Text Of")) { //$NON-NLS-1$//$NON-NLS-2$ content = content.replaceAll("Contains Text Of", "Contains"); //$NON-NLS-1$ //$NON-NLS-2$ content = content.replaceAll("Strict Contains", "Contains"); //$NON-NLS-1$ //$NON-NLS-2$ appItem.setTextContent(content); modified = true; } } } if (modified) { result = Util.nodeToString(document); } } catch (Exception e) { log.error(e.getMessage(), e); } } return result; } private DocumentBuilder getDocumentBuilder() throws ParserConfigurationException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setValidating(false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); return documentBuilder; } }