// ============================================================================
//
// 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.utils;
import java.io.File;
import java.io.StringReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.swt.widgets.TreeItem;
import org.talend.mdm.commmon.util.core.ICoreConstants;
import org.talend.mdm.commmon.util.webapp.XSystemObjects;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.models.IXObjectModelListener;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.models.TreeParent;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSCategoryData;
public class LocalTreeObjectRepository implements IXObjectModelListener, ITreeViewerListener {
private static Log log = LogFactory.getLog(LocalTreeObjectRepository.class);
private boolean internalCheck = false;
private boolean synchronize = false;
private ArrayList<String> accommodations = new ArrayList<String>();
private HashMap<String, Element> outPutSchemas = new HashMap<String, Element>();
private static String config = System.getProperty("user.dir") + "/.treeObjectConfig.xml";//$NON-NLS-1$//$NON-NLS-2$
private static String rootPath = "/" + ICoreConstants.DEFAULT_CATEGORY_ROOT;//$NON-NLS-1$
private static String DEFAULT_CATALOG = "System";//$NON-NLS-1$
private static String EXPAND_NAME = "Expand";//$NON-NLS-1$
private static String EXPAND_VALUE = "true";//$NON-NLS-1$
private static String COLLAPSE_VALUE = "false";//$NON-NLS-1$
private static String URL = "Url";//$NON-NLS-1$
private static String REALNAME = "Name";//$NON-NLS-1$
private static int XTENTIS_LEVEL = 4;
private static int MODEL_LEVEL = 3;
private Element catalogTreeObj = null;
private TreeItem itemFocus = null;
private Document spareDoc = null;
private TreeObject[] originalImportXobjects = null;
private String[] importCategories = null;
private boolean lazySave = true;
private static HashMap<String, Credential> credentials = new HashMap<String, Credential>();
private static LocalTreeObjectRepository repository = null;
synchronized public static LocalTreeObjectRepository getInstance() {
if (repository == null) {
repository = new LocalTreeObjectRepository();
}
return repository;
}
private class Credential {
public String user;
public String pwd;
public Document doc;
public TMDMService service;
public boolean state;
public Credential(String user, String pwd, Document doc) {
this.user = user;
this.pwd = pwd;
this.doc = doc;
}
}
public void startUp(String ur, String user, String pwd) {
TMDMService service = null;
Document doc = null;
SAXReader saxReader = new SAXReader();
try {
service = Util.getMDMService(new URL(ur), user, pwd);
WSCategoryData category = service.getMDMCategory(null);
doc = saxReader.read(new StringReader(category.getCategorySchema()));
saveCredential(ur, user, pwd, doc, service, true);
doUpgrade(UnifyUrl(ur));
} catch (Exception e) {
log.error(e.getMessage(), e);
String empty = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";//$NON-NLS-1$
empty += "<" + ICoreConstants.DEFAULT_CATEGORY_ROOT + "/>";//$NON-NLS-1$//$NON-NLS-2$
WSCategoryData newData = new WSCategoryData();
newData.setCategorySchema(empty);
try {
newData = service.getMDMCategory(newData);
doc = saxReader.read(new StringReader(newData.getCategorySchema()));
saveCredential(ur, user, pwd, doc, service, true);
} catch (Exception e1) {
saveCredential(ur, user, pwd, doc, service, false);
}
}
}
private void saveCredential(String ur, String user, String pwd, Document doc, TMDMService service, boolean stat) {
Credential credal = credentials.get(UnifyUrl(ur));
if (credal == null) {
credal = new Credential(user, pwd, doc);
}
credal.service = service;
if (credal.doc == null) {
credal.doc = doc;
}
credal.state = stat;
credentials.put(UnifyUrl(ur), credal);
}
private void doUpgrade(String url) {
Document doc = credentials.get(url).doc;
String path = "//child::*[text() = '" + TreeObject.CATEGORY_FOLDER + "' and count(@Universe) = 0 and count(@Url) = 0"//$NON-NLS-1$//$NON-NLS-2$
+ "]";//$NON-NLS-1$
List<Element> categorys = doc.selectNodes(path);
for (Element elem : categorys) {
Attribute attr = elem.attribute(URL);
if (attr == null) {
elem.addAttribute(URL, UnifyUrl(url));
}
}
saveDocument(url);
}
private boolean forceDelete() {
File configFile = new File(config);
boolean result = false;
int tryCount = 0;
while (!result && tryCount++ < 10) {
System.gc();
result = configFile.delete();
}
if (result) {
MessageDialog.openWarning(null, Messages.LocalTreeObjectRepository_ErrorTitle,
Messages.LocalTreeObjectRepository_ErrorMsg);
}
return result;
}
private String getXPathForElem(Element elem) {
List<String> xpathList = new ArrayList<String>();
recurseElementForXPath(elem, xpathList);
String xpathVar = "";//$NON-NLS-1$
for (int idx = xpathList.size() - 1; idx >= 0; idx--) {
xpathVar += "/" + xpathList.get(idx);//$NON-NLS-1$
}
return xpathVar;
}
private void recurseElementForXPath(Element elem, List<String> xpathList) {
if (elem != null) {
xpathList.add(elem.getName());
recurseElementForXPath(elem.getParent(), xpathList);
}
}
public void handleEvent(int type, TreeObject parent, TreeObject child) {
if (internalCheck || child.getServerRoot() == null) {
return;
}
String url = UnifyUrl(child.getServerRoot().getWsKey().toString());
Credential cre = credentials.get(url);
if (cre != null) {
if (cre.state == false) {
return;
}
}
try {
switch (type) {
case IXObjectModelListener.ADD:
addChild(parent, child);
break;
case IXObjectModelListener.DELETE:
removeChild(parent, child);
break;
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
private Element getTopElementWithUser(String user, String ip) {
Document doc = credentials.get(ip).doc;
List<Element> userRoots = doc.selectNodes(rootPath + "/" + user);//$NON-NLS-1$
Element elementUser;
if (userRoots.isEmpty()) {
elementUser = doc.getRootElement().addElement(user);
elementUser.setText("0");//$NON-NLS-1$
} else {
elementUser = userRoots.get(0);
}
return elementUser;
}
private void saveDocument(TreeObject parent) {
if (lazySave || parent == null || parent.getServerRoot() == null) {
return;
}
String url = UnifyUrl(parent.getServerRoot().getWsKey().toString());
saveDocument(url);
}
private void saveDocument(String url) {
if (credentials.get(url) != null) {
TMDMService service = credentials.get(url).service;
Document doc = credentials.get(url).doc;
if (doc != null) {
service.getMDMCategory(new WSCategoryData(doc.asXML()));
}
}
}
private String convertSpecCharToDigital(String res) {
String cpy = "", trail = ".";//$NON-NLS-1$//$NON-NLS-2$
Pattern mask = Pattern.compile("[\\W]+");//$NON-NLS-1$
for (int id = 0; id < res.length(); id++) {
String slip = "" + res.charAt(id);//$NON-NLS-1$
Matcher matcher = mask.matcher(slip);
if (matcher.find()) {
cpy += "" + (int) res.charAt(id);//$NON-NLS-1$
trail += (int) res.charAt(id);
} else {
cpy += slip;
}
}
mask = Pattern.compile("[\\d]+");//$NON-NLS-1$
String chead = "" + cpy.charAt(0);//$NON-NLS-1$
Matcher match = mask.matcher(chead);
if (match.find()) {
int var = 'a' + Integer.parseInt(chead);
chead = (char) var + "";//$NON-NLS-1$
if (cpy.length() > 1) {
cpy = chead + cpy.substring(1, cpy.length());
} else {
cpy = chead;
}
cpy += chead;
}
if (!res.equals(cpy)) {
cpy += "qwer1ty2ui4o";//$NON-NLS-1$
}
return cpy + (trail.length() > 1 ? trail : "");//$NON-NLS-1$
}
private String filterOutBlank(String input) {
Pattern mask = Pattern.compile("([\\s]+)");//$NON-NLS-1$
String res = mask.matcher(input).replaceAll("");//$NON-NLS-1$
res = res.replaceAll("\\[\\w+\\]", "");//$NON-NLS-1$//$NON-NLS-2$
return convertSpecCharToDigital(res);
}
public Element getParentElement(TreeObject treeObj) {
if (!(treeObj instanceof TreeParent)) {
return null;
}
if (treeObj.getServerRoot() == null) {
return null;
}
Element elemFolder = null;
String xpath = getXPathForTreeObject(treeObj);
if (credentials.get(UnifyUrl(treeObj.getServerRoot().getWsKey().toString())) == null) {
return null;
}
Document doc = credentials.get(UnifyUrl(treeObj.getServerRoot().getWsKey().toString())).doc;
if (doc.selectNodes(xpath).isEmpty()) {
xpath = xpath.replaceAll("\\[.*\\]", "");//$NON-NLS-1$//$NON-NLS-2$
if (doc.selectNodes(xpath).isEmpty()) {
xpath = getXPathForTreeObject(treeObj.getParent() != null ? treeObj.getParent() : treeObj.getServerRoot());
}
if (xpath != null) {
Element elemTop = null;
if (doc.selectNodes(xpath).isEmpty()) {
elemTop = getTopElementWithUser(treeObj.getServerRoot().getUser().getUsername(), UnifyUrl(treeObj
.getServerRoot().getWsKey().toString()));
} else {
// process and trigger is in special, as they are located in EventManagement which is in the same
// level as data container and data model
if (treeObj.getType() == TreeObject.TRANSFORMER && treeObj.getParent() == null) {
xpath += "/EventManagement[text() = '33']";//$NON-NLS-1$
}
elemTop = (Element) doc.selectNodes(xpath).get(0);
}
String selPath = "./" + filterOutBlank(treeObj.getDisplayName()) + "[text() = '" + treeObj.getType() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (elemTop.selectNodes(selPath).isEmpty()) {
elemFolder = elemTop.addElement(filterOutBlank(treeObj.getDisplayName()));
elemFolder.setText(treeObj.getType() + "");//$NON-NLS-1$
} else {
elemFolder = (Element) elemTop.selectNodes(selPath).get(0);
}
}
} else {
elemFolder = (Element) doc.selectNodes(xpath).get(0);
}
return elemFolder;
}
private void addChild(TreeObject parent, TreeObject child) {
if (parent.getParent() == null && parent.getDisplayName().equals("INVISIBLE ROOT")) {
return;
}
if (parent.getServerRoot() == null) {
return;
}
String xpath = getXPathForTreeObject(child);
Document doc = credentials.get(UnifyUrl(parent.getServerRoot().getWsKey().toString())).doc;
List<Element> models = doc.selectNodes(xpath);
if (!models.isEmpty() && child instanceof TreeParent) {
Element model = models.get(0);
if (isAEXtentisObjects(model, child) == MODEL_LEVEL) {
checkUpAllCategoryForModel((TreeParent) child);
}
}
String catalog = synchronizeWithElem(child, (TreeParent) parent, true);
Element elemFolder = getParentElement(parent);
if (elemFolder != null) {
String xpathTail = "";//$NON-NLS-1$
String xpathTailOther = "']";//$NON-NLS-1$
xpath = "child::*[name()='" + filterOutBlank(child.getDisplayName()) + "' and text()='" + child.getType();//$NON-NLS-1$//$NON-NLS-2$
if (child.getType() == TreeObject.CATEGORY_FOLDER) {
xpathTail = "' and @Url='" + getURLFromTreeObject(child);//$NON-NLS-1$
}
List<Element> list = elemFolder.selectNodes(xpath + xpathTail + xpathTailOther);
if (list.isEmpty() && (catalog.equals("") || catalog == null)) {//$NON-NLS-1$
Element childElem = elemFolder.addElement(filterOutBlank(child.getDisplayName()));
childElem.setText(child.getType() + "");//$NON-NLS-1$
if (child.getType() == TreeObject.CATEGORY_FOLDER) {
childElem.addAttribute(URL, getURLFromTreeObject(child));
childElem.addAttribute(REALNAME, child.getDisplayName());
}
}
}
saveDocument(parent);
}
private void removeChild(TreeObject parent, TreeObject child) {
if (parent.getParent() == null && parent.getDisplayName().equals("INVISIBLE ROOT")) {
return;
}
if (synchronize) {
synchronizeWithElem(child, (TreeParent) parent, true);
}
Element elemFolder = getParentElement(parent);
String xpath = "child::*[name()='" + filterOutBlank(child.getDisplayName()) + "' and text()='" + child.getType() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (elemFolder == null) {
return;
}
List<Element> list = elemFolder.selectNodes(xpath);
if (!list.isEmpty()) {
elemFolder.remove(list.get(0));
}
saveDocument(parent);
}
public void correctDisplayNameForCategory(TreeObject category) {
if (category.getType() != TreeObject.CATEGORY_FOLDER) {
return;
}
if (category.getServerRoot() == null) {
return;
}
String xpath = getXPathForTreeObject(category);
Document doc = credentials.get(UnifyUrl(category.getServerRoot().getWsKey().toString())).doc;
List<Element> elems = doc.selectNodes(xpath);
if (elems.size() > 0) {
Element elem = elems.get(0);
String value = elem.attributeValue(REALNAME);
if (value != null) {
category.setDisplayName(value);
}
}
}
public void synchronizeWithDoc(TreeParent root) {
internalCheck = false;
TreeObject[] targetChildren = root.getChildren();
for (TreeObject treeObj : targetChildren) {
if (treeObj instanceof TreeParent && treeObj.getServerRoot() == treeObj) {
synchronizeWithDoc((TreeParent) treeObj);
}
synchronizeWithElem(treeObj, root, true);
}
}
private String getXPathForTreeObject(TreeObject theObj) {
List<String> xpathList = new ArrayList<String>();
recurseTreeObjectForXPath(theObj, xpathList);
String xpathVar = "";//$NON-NLS-1$
for (int idx = xpathList.size() - 1; idx >= 0; idx--) {
xpathVar += "/" + xpathList.get(idx);//$NON-NLS-1$
}
String xpathTail = "[text() = '" + theObj.getType() + "']";//$NON-NLS-1$//$NON-NLS-2$
if (theObj.getType() == TreeObject.CATEGORY_FOLDER) {
xpathTail = "[text() = '" + theObj.getType() + "' and @Url='" + getURLFromTreeObject(theObj) + "']";//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
}
return xpathVar + xpathTail;
}
private void recurseTreeObjectForXPath(TreeObject theObj, List<String> list) {
if (theObj.getParent() == null && theObj.getDisplayName().equals("INVISIBLE ROOT")) {//$NON-NLS-1$
list.add(rootPath);
return;
} else if (theObj instanceof TreeParent && theObj.getServerRoot() == theObj) {
list.add(theObj.getUser().getUsername());
list.add(ICoreConstants.DEFAULT_CATEGORY_ROOT);
return;
} else {
list.add(filterOutBlank(theObj.getDisplayName()));
}
recurseTreeObjectForXPath(theObj.getParent() != null ? theObj.getParent() : theObj.getServerRoot(), list);
}
private String getURLFromTreeObject(TreeObject theObj) {
String url = theObj.getServerRoot().getUser().getServerUrl();
// http://localhost:8080/talend/TalendPort
return UnifyUrl(url);
}
private String UnifyUrl(String url) {
Pattern mask = Pattern.compile("http://(.*?):(.*)");//$NON-NLS-1$
Matcher matcher = mask.matcher(url);
if (matcher.find()) {
String ip = matcher.group(1);
String ipAlias = "";//$NON-NLS-1$
String hostName = "";//$NON-NLS-1$
try {
InetAddress addr = InetAddress.getLocalHost();
ipAlias = addr.getHostAddress().toString();
hostName = addr.getHostName().toString();
if (ip.equals("127.0.0.1") || ip.equals(ipAlias) || ip.equals(hostName) || ip.equals("localhost")) {//$NON-NLS-1$//$NON-NLS-2$
url = "http://" + ipAlias + ":" + matcher.group(2);//$NON-NLS-1$//$NON-NLS-2$
}
} catch (UnknownHostException e) {
log.error(e.getMessage(), e);
}
}
return url;
}
private String synchronizeWithElem(TreeObject theObj, TreeParent folder, boolean fireEvent) {
internalCheck = fireEvent;
String catalogPath = "";//$NON-NLS-1$
ArrayList<String> catalogs = checkUpCatalogRepositoryForTreeObject(theObj, folder);
if (catalogs != null && folder.getType() != TreeObject.CATEGORY_FOLDER) {
// create a catalog folder and insert the theObj into it
TreeParent subFolder = folder;
TreeParent category = null;
for (String catalogName : catalogs) {
// if (catalogName.equals(filterOutBlank(folder.getDisplayName())))
// continue;
category = null;
for (TreeObject child : subFolder.getChildren()) {
if (child.getDisplayName().equals(catalogName) && child.getType() == TreeObject.CATEGORY_FOLDER
&& child instanceof TreeParent) {
category = (TreeParent) child;
subFolder = category;
break;
}
}
if (category == null) {
category = new TreeParent(catalogName, folder.getServerRoot(), TreeObject.CATEGORY_FOLDER, null, null);
subFolder.addChild(category);
category.setServerRoot(folder.getServerRoot());
addAttributeToCategoryElem(category, URL, getURLFromTreeObject(folder));
saveDocument(folder);
subFolder = category;
}
}
boolean exist = false;
for (TreeObject obj : category.getChildren()) {
if (obj.getDisplayName().equals(theObj.getDisplayName()) && obj.getType() == theObj.getType()) {
exist = true;
break;
}
}
if (!exist) {
folder.removeChild(theObj);
category.addChild(theObj);
}
catalogPath = catalogs.isEmpty() ? "" : catalogs.get(0);//$NON-NLS-1$
} else {
// check up the system catalog, create it and all system tree objects
// into it if these objects are not categorized
if (XSystemObjects.isExist(theObj.getType(), theObj.getDisplayName())) {
TreeParent systemCatalog = null;
for (TreeObject xobj : folder.getChildren()) {
if (DEFAULT_CATALOG.equals(filterOutBlank(xobj.getDisplayName()))
&& xobj.getType() == TreeObject.CATEGORY_FOLDER) {
systemCatalog = (TreeParent) xobj;
break;
}
}
if (folder.getDisplayName().equals("System") && folder.getType() == TreeObject.CATEGORY_FOLDER) {
return DEFAULT_CATALOG;
}
if (theObj.getParent() == null) {
internalCheck = !fireEvent;
return DEFAULT_CATALOG;
}
if (theObj.getServerRoot() != null) {
String xpath = "//" + theObj.getServerRoot().getUser().getUsername() + "/"//$NON-NLS-1$//$NON-NLS-2$
+ filterOutBlank(folder.getDisplayName()) + "//child::*[name() = 'System'"//$NON-NLS-1$
+ " and @Url='" + getURLFromTreeObject(theObj) + "']";//$NON-NLS-1$//$NON-NLS-2$
Document doc = credentials.get(UnifyUrl(folder.getServerRoot().getWsKey().toString())).doc;
if (systemCatalog == null) {
List<Element> elems = doc.selectNodes(xpath);
if (elems.isEmpty()) {
systemCatalog = new TreeParent(DEFAULT_CATALOG, folder.getServerRoot(), TreeObject.CATEGORY_FOLDER,
null, null);
folder.addChild(systemCatalog);
folder.removeChild(theObj);
systemCatalog.addChild(theObj);
systemCatalog.setServerRoot(folder.getServerRoot());
Element elemFolder = getParentElement(folder);
Element elemSystem = elemFolder.addElement(systemCatalog.getDisplayName());
elemSystem.setText(TreeObject.CATEGORY_FOLDER + "");//$NON-NLS-1$
elemSystem.addAttribute(URL, getURLFromTreeObject(folder));
Element childElem = elemSystem.addElement(filterOutBlank(theObj.getDisplayName()));
childElem.setText(theObj.getType() + "");//$NON-NLS-1$
saveDocument(folder);
}
} else {
boolean exist = false;
for (TreeObject xbj : systemCatalog.getChildren()) {
if (xbj.getDisplayName().equals(theObj.getDisplayName()) && xbj.getType() == theObj.getType()) {
exist = true;
break;
}
}
if (!exist) {
folder.removeChild(theObj);
systemCatalog.addChild(theObj);
List<Element> elems = doc.selectNodes(xpath);
if (!elems.isEmpty()) {
elems.get(0).addElement(filterOutBlank(theObj.getDisplayName())).setText(theObj.getType() + "");//$NON-NLS-1$
saveDocument(folder);
}
}
}
}
catalogPath = DEFAULT_CATALOG;
}
}
// check up the catalog with none children
checkUpCatalogHavingNoChildren(theObj, folder);
if (theObj instanceof TreeParent) {
TreeParent subParent = (TreeParent) theObj;
for (TreeObject obj : subParent.getChildren()) {
synchronizeWithElem(obj, subParent, fireEvent);
}
}
internalCheck = !fireEvent;
return catalogPath;
}
private void checkUpAllCategoryForModel(TreeParent model) {
if (model.getServerRoot() == null) {
return;
}
String xpath = "//" + model.getServerRoot().getUser().getUsername() + "/" + filterOutBlank(model.getDisplayName())//$NON-NLS-1$//$NON-NLS-2$
+ "//child::*[text() = '" + TreeObject.CATEGORY_FOLDER + "' and @Url='" + getURLFromTreeObject(model) + "']";//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
Document doc = credentials.get(UnifyUrl(model.getServerRoot().getWsKey().toString())).doc;
String xpathForModel = getXPathForTreeObject(model);
List<Element> elems = doc.selectNodes(xpathForModel);
Element modelElem = elems.get(0);
elems = doc.selectNodes(xpath);
for (Element elem : elems) {
Element spec = elem;
ArrayList<Element> hierarchicalList = new ArrayList<Element>();
while (spec != modelElem) {
hierarchicalList.add(spec);
spec = spec.getParent();
}
Collections.reverse(hierarchicalList);
TreeParent modelCpy = model;
while (!hierarchicalList.isEmpty()) {
spec = hierarchicalList.remove(0);
String elemName = spec.getName();
if (spec.attributeValue(REALNAME) != null) {
elemName = spec.attributeValue(REALNAME);
}
TreeObject to = findObject(modelCpy, Integer.parseInt(spec.getText().trim()), elemName);
if (to == null) {
TreeParent catalog = new TreeParent(elemName, modelCpy.getServerRoot(), TreeObject.CATEGORY_FOLDER, null,
null);
boolean cpyInternalCheck = internalCheck;
internalCheck = true;
modelCpy.addChild(catalog);
internalCheck = cpyInternalCheck;
modelCpy = catalog;
} else {
modelCpy = (TreeParent) to;
}
}
}
}
private TreeObject findObject(TreeObject xobj, int type, String name) {
if (!(xobj instanceof TreeParent)) {
return null;
}
TreeParent parent = (TreeParent) xobj;
for (TreeObject child : parent.getChildren()) {
if (child.getType() == type && filterOutBlank(child.getDisplayName()).equals(filterOutBlank(name))) {
return child;
}
}
return null;
}
private void checkUpCatalogHavingNoChildren(TreeObject theObj, TreeParent folder) {
if (folder.getServerRoot() == folder || theObj.getServerRoot() == null) {
return;
}
if (folder.getServerRoot() == null) {
return;
}
Document doc = credentials.get(UnifyUrl(folder.getServerRoot().getWsKey().toString())).doc;
String path = this.getXPathForTreeObject(folder);
List<Element> topElems = doc.selectNodes(path);
if (topElems.size() > 0 && folder.getParent() != null) {
if (isAEXtentisObjects(topElems.get(0), folder) == XTENTIS_LEVEL && folder.getParent().getType() == 23) {
if (topElems.get(0).getParent() != null) {
if (isAEXtentisObjects(topElems.get(0).getParent(), folder) == MODEL_LEVEL && folder.getType() == 24) {
accommodations.add("Resources");//$NON-NLS-1$
}
}
}
}
String accmds = "";//$NON-NLS-1$
for (String accmd : accommodations) {
if (accmd == accommodations.get(0)) {
accmds = "/";//$NON-NLS-1$
}
accmds += accmd;
if (accmd != accommodations.get(accommodations.size() - 1)) {
accmds += "//";//$NON-NLS-1$
}
}
String xpath = "//" + theObj.getServerRoot().getUser().getUsername() + accmds + "/"//$NON-NLS-1$//$NON-NLS-2$
+ filterOutBlank(folder.getDisplayName()) + "//child::*[text() = '" + TreeObject.CATEGORY_FOLDER//$NON-NLS-1$
+ "' and @Url='" + getURLFromTreeObject(theObj)//$NON-NLS-1$
+ "' and count(child::*) = 0]";//$NON-NLS-1$
TreeParent subFolder = folder;
List<Element> elems = doc.selectNodes(xpath);
for (Element elem : elems) {
String xpaths = getXPathForElem(elem);
int modelPos = xpaths.indexOf(filterOutBlank(folder.getDisplayName()));
if (modelPos == -1) {
System.err.println("elem.getName() is in wrong position !!!"); //$NON-NLS-1$
return;
}
xpaths = xpaths.substring(modelPos + filterOutBlank(folder.getDisplayName()).length() + 1);
modelPos = xpaths.indexOf("/");//$NON-NLS-1$
String xpathTrack = getXPathForElem(elem).substring(0, getXPathForElem(elem).indexOf(xpaths) - 1);
while (modelPos != -1 || (!xpaths.equals("") && modelPos == -1)) {//$NON-NLS-1$
String nodeName = modelPos != -1 ? xpaths.substring(0, modelPos) : xpaths;
xpathTrack += "/" + nodeName;//$NON-NLS-1$
List<Element> parnts = doc.selectNodes(xpathTrack);
if (parnts.size() > 0 && parnts.get(0).attributeValue(REALNAME) != null) {
nodeName = parnts.get(0).attributeValue(REALNAME);
}
boolean catalogExist = false;
for (TreeObject child : subFolder.getChildren()) {
if (nodeName.equals(child.getDisplayName()) && child.getType() == TreeObject.CATEGORY_FOLDER) {
catalogExist = true;
subFolder = (TreeParent) child;
break;
}
}
if (!catalogExist) {
if (parnts.size() > 0 && parnts.get(0).getText().equals(TreeObject.CATEGORY_FOLDER)) {
TreeParent catalog = new TreeParent(nodeName, folder.getServerRoot(), TreeObject.CATEGORY_FOLDER, null,
null);
subFolder.addChild(catalog);
subFolder = catalog;
}
}
if (xpaths.indexOf("/") != -1) {//$NON-NLS-1$
xpaths = xpaths.substring(modelPos + 1);
modelPos = xpaths.indexOf("/");//$NON-NLS-1$
} else {
xpaths = "";//$NON-NLS-1$
}
}
subFolder = folder;
}
accommodations.clear();
}
private ArrayList<String> checkUpCatalogRepositoryForTreeObject(TreeObject theObj, TreeObject folder) {
if (theObj.getType() == 0 || theObj.getType() == TreeObject.CATEGORY_FOLDER) {
return null;
}
try {
String modelName = getXPathForTreeObject(folder);
String url = getURLFromTreeObject(theObj);
String xpath = modelName
+ "//child::*[text() = '" + TreeObject.CATEGORY_FOLDER + "' and @Url='" + url + "']//child::*";//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
Document doc = credentials.get(getURLFromTreeObject(folder)).doc;
List<Element> elems = doc.selectNodes(xpath);
for (Element elem : elems) {
String xpathElem = getXPathForElem(elem);
String xpathObj = getXPathForTreeObject(theObj);
int squarebk = xpathObj.indexOf("[");//$NON-NLS-1$
if (squarebk != -1) {
xpathObj = xpathObj.substring(0, squarebk);
}
if (elem.getName().equals(filterOutBlank(theObj.getDisplayName()))
&& elem.getData().toString().equals(theObj.getType() + "")) {//$NON-NLS-1$
ArrayList<String> path = new ArrayList<String>();
HashMap<Integer, String> slice = new HashMap<Integer, String>();
while (isAEXtentisObjects(elem, theObj) > XTENTIS_LEVEL) {
String elemName = elem.getParent().getName();
if (elem.getParent().attributeValue(REALNAME) != null) {
elemName = elem.getParent().attributeValue(REALNAME);
}
if (elem.getText() != null
&& StringUtils.trim(elem.getParent().getText()).equals(TreeObject.CATEGORY_FOLDER + "")) {//$NON-NLS-1$
path.add(elem.getParent().getName());
if (elem.getParent().attributeValue(REALNAME) != null) {
slice.put(path.size() - 1, elem.getParent().attributeValue(REALNAME));
}
}
elem = elem.getParent();
}
ArrayList<String> pathCpy = new ArrayList<String>(path);
Collections.reverse(path);
if (!isEqualString(xpathElem, xpathObj, path)) {
path = null;
}
if (path != null) {
for (int i = 0; i < pathCpy.size(); i++) {
if (slice.get(i) != null) {
pathCpy.set(i, slice.get(i));
}
}
Collections.reverse(pathCpy);
path = pathCpy;
}
return path;
}
}
} catch (Exception ex) {
return null;
}
return null;
}
private boolean isEqualString(String xpathElem, String xpathObj, ArrayList<String> catalogs) {
ArrayList<String> elems = new ArrayList<String>(Arrays.asList(xpathElem.split("/")));//$NON-NLS-1$
ArrayList<String> objs = new ArrayList<String>(Arrays.asList(xpathObj.split("/")));//$NON-NLS-1$
int orgSize = objs.size();
for (int i = 0; i < objs.size(); i++) {
if (!objs.get(i).equals(elems.get(i))) {
objs.addAll(i, catalogs);
break;
}
}
if (orgSize == objs.size() && orgSize != elems.size()) {
objs.addAll(objs.size(), catalogs);
}
return CollectionUtils.isEqualCollection(elems, objs);
}
private int isAEXtentisObjects(Element elemXobj, TreeObject treeObj) {
if (elemXobj == null || treeObj.getServerRoot() == null) {
return 0;
}
Document doc = credentials.get(UnifyUrl(treeObj.getServerRoot().getWsKey().toString())).doc;
if (elemXobj == doc.getRootElement()) {
return 1;
}
return 1 + isAEXtentisObjects(elemXobj.getParent(), treeObj);
}
public int receiveUnCertainTreeObjectType(TreeObject xobj) {
String path = this.getXPathForTreeObject(xobj);
int level = XTENTIS_LEVEL;
if (path.startsWith("/category/admin/EventManagement")) {//$NON-NLS-1$
level = XTENTIS_LEVEL + 1;
}
Document doc = credentials.get(UnifyUrl(xobj.getServerRoot().getWsKey().toString())).doc;
List<Element> elems = doc.selectNodes(path);
if (!elems.isEmpty()) {
Element elem = elems.get(0);
while (isAEXtentisObjects(elem, xobj) >= level) {
elem = elem.getParent();
}
return Integer.parseInt(elem.getText().trim());
} else {
return -1;
}
}
public void switchOnListening() {
internalCheck = false;
}
public void switchOffListening() {
internalCheck = true;
}
public void swithOnSynchronize() {
synchronize = true;
}
public void switchOffSynchronize() {
synchronize = false;
}
public TreeObject registerNewTreeObject(TreeObject treeObject) {
if (treeObject.getType() == TreeObject.CATEGORY_FOLDER) {
String xpath = getXPathForTreeObject(treeObject);
Document doc = credentials.get(UnifyUrl(treeObject.getServerRoot().getWsKey().toString())).doc;
List<Element> elems = doc.selectNodes(xpath);
if (!elems.isEmpty()) {
if (catalogTreeObj == null) {
catalogTreeObj = elems.get(0);
}
}
treeObject = treeObject.getParent();
treeObject = registerNewTreeObject(treeObject);
} else if (!(treeObject instanceof TreeParent) && treeObject.getParent().getType() == TreeObject.CATEGORY_FOLDER) {
registerNewTreeObject(treeObject.getParent());
treeObject = treeObject.getParent().getParent();
}
return treeObject;
}
public void mergeNewTreeObject(TreeObject newTreeObject) {
if (catalogTreeObj != null) {
catalogTreeObj.addElement(filterOutBlank(newTreeObject.getDisplayName())).setText(newTreeObject.getType() + "");//$NON-NLS-1$
saveDocument(newTreeObject);
}
catalogTreeObj = null;
}
public boolean isInSystemCatalog(TreeObject xobject) {
if (xobject instanceof TreeParent) {
if (xobject.getType() == TreeObject.CATEGORY_FOLDER && xobject.getDisplayName().equals("System")) {//$NON-NLS-1$
Document doc = credentials.get(UnifyUrl(xobject.getServerRoot().getWsKey().toString())).doc;
String path = this.getXPathForTreeObject(xobject);
List<Element> elems = doc.selectNodes(path);
if (!elems.isEmpty()) {
Element elem = elems.get(0);
if (isAEXtentisObjects(elem, xobject) == XTENTIS_LEVEL) {
return true;
}
}
}
return false;
} else {
TreeParent parent = xobject.getParent();
return isInSystemCatalog(parent);
}
}
public void treeCollapsed(TreeExpansionEvent event) {
setTreeNodeImage(event, false);
}
public void treeExpanded(TreeExpansionEvent event) {
setTreeNodeImage(event, true);
}
private void addAttributeToCategoryElem(TreeParent category, String attrName, String defaultAttrValue) {
Element elem = locateCategoryElement(category);
Attribute attr = elem.attribute(attrName);
if (attr != null) {
elem.remove(attr);
}
elem.addAttribute(attrName, defaultAttrValue);
}
private Element locateCategoryElement(TreeParent category) {
if (category.getParent() == category.getServerRoot()) {
return null;
}
String xpath = "//" + category.getServerRoot().getUser().getUsername() + "//"//$NON-NLS-1$//$NON-NLS-2$
+ filterOutBlank(category.getParent().getDisplayName()) + "//child::*/.[text() = '" + TreeObject.CATEGORY_FOLDER//$NON-NLS-1$
+ "' and name()='" + filterOutBlank(category.getDisplayName()) + "' and @Url = '" + getURLFromTreeObject(category) + "']";//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
Document doc = credentials.get(UnifyUrl(category.getServerRoot().getWsKey().toString())).doc;
List<Element> elms = doc.selectNodes(xpath);
return !elms.isEmpty() ? elms.get(0) : null;
}
private void setTreeNodeImage(TreeExpansionEvent event, boolean expand) {
// Object elem = event.getElement();
// Widget item = view.getViewer().testFindItem(event.getElement());
// if (view == null) {
// return;
// }
// if (item == null || (item != itemFocus && itemFocus != null)) {
// item = itemFocus;
// }
// if (elem instanceof TreeParent && item != null) {
// TreeParent parent = (TreeParent) elem;
// if (parent.getType() == TreeObject.CATEGORY_FOLDER) {
// ((TreeItem) item).setImage(expand ? ImageCache.getCreatedImage("icons/folder_open.gif") : ImageCache//$NON-NLS-1$
// .getCreatedImage("icons/folder.gif"));//$NON-NLS-1$
//
// Element elemCategory = locateCategoryElement(parent);
// if (elemCategory != null) {
// elemCategory.attribute(EXPAND_NAME).setValue(expand ? EXPAND_VALUE : COLLAPSE_VALUE);
// saveDocument(parent);
// }
//
// }
// }
}
public boolean getCategoryExpandState(TreeParent category) {
Element elem = locateCategoryElement(category);
if (elem != null) {
return Boolean.valueOf(elem.attribute(EXPAND_NAME).getValue());
}
return false;
}
private void getTreeItemFromTreeObject(TreeItem[] items, TreeObject xobj, ArrayList<TreeItem> ret) {
for (TreeItem o : items) {
TreeObject treeObj = (TreeObject) o.getData();
if (equalTermsWithTreeObject(treeObj, xobj)) {
ret.add(o);
return;
}
getTreeItemFromTreeObject(o.getItems(), xobj, ret);
}
}
private boolean equalTermsWithTreeObject(TreeObject theObj, TreeObject otherObj) {
if (theObj == null || otherObj == null) {
return false;
}
if (theObj == otherObj) {
return true;
}
if (theObj.getParent() == theObj.getServerRoot() && otherObj.getParent() == otherObj.getServerRoot()) {
if (theObj.getDisplayName().equals(otherObj.getDisplayName())) {
return true;
} else {
return false;
}
}
if (theObj.getType() != otherObj.getType()
|| !filterOutBlank(theObj.getDisplayName()).equals(filterOutBlank(otherObj.getDisplayName()))) {
return false;
}
return equalTermsWithTreeObject(theObj.getParent(), otherObj.getParent());
}
//
// public void refreshCategoryStateWithinModel(TreeParent model) {
// Element elemCategory = null;
// for (TreeObject xobj : model.getChildren()) {
// if (xobj instanceof TreeParent) {
// refreshCategoryStateWithinModel((TreeParent) xobj);
// } else {
// continue;
// }
//
// elemCategory = locateCategoryElement((TreeParent) xobj);
// if (elemCategory == null) {
// continue;
// }
// Attribute attr = elemCategory.attribute(EXPAND_NAME);
// if (attr != null) {
// String value = attr.getValue();
// Tree tree = (Tree) view.getViewer().getControl();
// ArrayList<TreeItem> list = new ArrayList<TreeItem>();
// getTreeItemFromTreeObject(tree.getItems(), xobj, list);
// itemFocus = list.isEmpty() ? null : list.get(0);
// if (itemFocus == null) {
// return;
// }
// TreeExpansionEvent event = new TreeExpansionEvent(view.getViewer(), xobj);
// if (value.equals(EXPAND_VALUE)) {
// // set the category to be closed if it is empty
// if (elemCategory.elements().isEmpty()) {
// itemFocus.setExpanded(false);
// treeCollapsed(event);
// } else {
// itemFocus.setExpanded(true);
// treeExpanded(event);
// }
// } else {
// itemFocus.setExpanded(false);
// treeCollapsed(event);
// }
// itemFocus = null;
// }
// }
// }
public void resetAllCategoryState(TreeParent root) {
for (TreeObject xobj : root.getChildren()) {
if (xobj.getType() == TreeObject.CATEGORY_FOLDER) {
locateCategoryElement((TreeParent) xobj).attribute(EXPAND_NAME).setValue(COLLAPSE_VALUE);
}
if (xobj instanceof TreeParent && xobj.getType() != TreeObject.CATEGORY_FOLDER) {
resetAllCategoryState((TreeParent) xobj);
}
}
saveDocument(root);
}
public void receiveAllOffsprings(TreeParent parent, ArrayList<TreeObject> list) {
list.addAll(Arrays.asList(parent.getChildren()));
for (TreeObject obj : parent.getChildren()) {
if (obj instanceof TreeParent) {
receiveAllOffsprings((TreeParent) obj, list);
}
}
}
public void setLazySaveStrategy(boolean lazy, TreeParent parent) {
lazySave = lazy;
saveDocument(parent);
}
public void addAccommodation(String name) {
accommodations.add(name);
}
public void clearAccommodation() {
accommodations.clear();
}
private Element parseElements(String schema) {
SAXReader saxReader = new SAXReader();
try {
Document doc = saxReader.read(new StringReader(schema));
return doc.getRootElement();
} catch (DocumentException e) {
log.error(e.getMessage(), e);
}
return null;
}
public void makeUpDocWithImportCategory(String[] schemas, TreeParent serverRoot) {
if (serverRoot.getServerRoot() == null) {
return;
}
Document orgDoc = credentials.get(UnifyUrl(serverRoot.getServerRoot().getWsKey().toString())).doc;
// spareDoc is meant to show the category when import digloag is launched
spareDoc = (Document) orgDoc.clone();
if (schemas != null) {
for (String schema : schemas) {
Element subRoot = parseElements(schema);
String subRootXquery = "descendant::" + subRoot.getName() + "[text()='" + subRoot.getTextTrim() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
Element division = pingElement(subRootXquery, spareDoc.getRootElement());
if (division == null || division.getParent() == null) {
return;
}
Element divisionParent = division.getParent();
divisionParent.remove(division);
divisionParent.add((Element) subRoot.clone());
}
String url = getURLFromTreeObject(serverRoot);
String urlXquery = "descendant::*[@Url != '" + url + "']";//$NON-NLS-1$//$NON-NLS-2$
List<Element> elems = spareDoc.selectNodes(urlXquery);
for (Element elem : elems) {
elem.addAttribute("Url", url);//$NON-NLS-1$
}
}
credentials.get(UnifyUrl(serverRoot.getServerRoot().getWsKey().toString())).doc = spareDoc;
spareDoc = orgDoc;
importCategories = schemas;
}
public void setOriginalXobjectsToImport(TreeObject[] originalXobjects) {
originalImportXobjects = originalXobjects;
}
public void mergeImportCategory(TreeObject[] xobjectsToImport, TreeParent serverRoot) {
if (xobjectsToImport.length == 0 || originalImportXobjects == null || originalImportXobjects.length == 0) {
return;
}
Collection dels = CollectionUtils.subtract(Arrays.asList(originalImportXobjects), Arrays.asList(xobjectsToImport));
ArrayList<TreeObject> delList = new ArrayList<TreeObject>(dels);
ArrayList<String> xpaths = new ArrayList<String>();
for (TreeObject del : delList) {
String xpath = this.getXPathForTreeObject(del);
xpath.replaceFirst("/" + del.getServerRoot().getUser().getUsername(), "/" + serverRoot.getUser().getUsername());//$NON-NLS-1$//$NON-NLS-2$
xpaths.add(xpath);
}
mergeImportCategory(importCategories, serverRoot, xpaths);
}
public void cancelMergeImportCategory(TreeParent serverRoot) {
if (spareDoc != null) {
if (serverRoot != null && serverRoot.getServerRoot() != null) {
String key = UnifyUrl(serverRoot.getServerRoot().getWsKey().toString());
if (credentials.get(key) != null) {
credentials.get(key).doc = spareDoc;
}
}
originalImportXobjects = null;
importCategories = null;
spareDoc = null;
}
}
private void mergeImportCategory(String[] schemas, TreeParent serverRoot, ArrayList<String> xpathsToDel) {
if (serverRoot.getServerRoot() == null) {
return;
}
Document orgDoc = spareDoc;
String user = serverRoot.getServerRoot().getUser().getUsername();
String xpathPrefix = "/category/" + user;//$NON-NLS-1$
String xmlPrefix = "<category><" + user + ">*</" + user + "></category>";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (schemas == null) // old version, skip the import
{
credentials.get(UnifyUrl(serverRoot.getServerRoot().getWsKey().toString())).doc = orgDoc;
return;
}
for (String schema : schemas) {
Element root = parseElements(xmlPrefix.replace("*", schema));//$NON-NLS-1$
Element subRoot = parseElements(schema);
// delete all unselected xobjects from orgDoc
for (String xpathToDel : xpathsToDel) {
Element elemToDel = pingElement(xpathToDel, root);
if (elemToDel != null) {
Element parent = elemToDel.getParent();
if (parent != null) {
parent.remove(elemToDel);
}
}
}
// check out all categories having none child, and delete them if available
String xpathForCategoriesWithNoneChild = "//child::*[count(child::*) = 0 and text()='" + TreeObject.CATEGORY_FOLDER//$NON-NLS-1$
+ "']";//$NON-NLS-1$
Element categoryToDel = pingElement(xpathForCategoriesWithNoneChild, root);
while (categoryToDel != null) {
Element categoryParent = categoryToDel.getParent();
if (categoryParent != null) {
categoryParent.remove(categoryToDel);
}
categoryToDel = pingElement(xpathForCategoriesWithNoneChild, root);
}
subRoot = this.pingElement(xpathPrefix + "/" + subRoot.getName(), root);//$NON-NLS-1$
String xpathForCategory = "//descendant::*[text()='" + TreeObject.CATEGORY_FOLDER + "']";//$NON-NLS-1$//$NON-NLS-2$
List<Element> elementList = subRoot.selectNodes(xpathForCategory);
List<String> categoryXpathForCurDoc = new ArrayList<String>();
List<String> categoryXpathForOrgDoc = new ArrayList<String>();
for (Element element : elementList) {
List<String> categoryHierarchicals = parseXpathForElement(element, subRoot);
String xpathForOrgCategory = xpathPrefix + "/" + subRoot.getName();//$NON-NLS-1$
for (String categoryHierarchical : categoryHierarchicals) {
xpathForOrgCategory += "/" + categoryHierarchical;//$NON-NLS-1$
}
if (!categoryXpathForOrgDoc.contains(xpathForOrgCategory)) {
categoryXpathForOrgDoc.add(xpathForOrgCategory);
}
}
xpathForCategory = xpathPrefix + "/" + subRoot.getName() + "//descendant::*[text()='" + TreeObject.CATEGORY_FOLDER//$NON-NLS-1$//$NON-NLS-2$
+ "']";//$NON-NLS-1$
// String xpathForOrgCategory = xpathPrefix + "/" + subRoot.getName() + "//descendant::" + element.getName()
// + "[text()='" + element.getTextTrim() + "']";
String topElemXpath = xpathPrefix + "/" + subRoot.getName();//$NON-NLS-1$
Element topElem = pingElement(topElemXpath, orgDoc.getRootElement());
elementList = orgDoc.getRootElement().selectNodes(xpathForCategory);
for (Element elem : elementList) {
List<String> categoryHierarchicals = parseXpathForElement(elem, topElem);
String xpathForOrgCategory = xpathPrefix + "/" + subRoot.getName();//$NON-NLS-1$
for (String categoryHierarchical : categoryHierarchicals) {
xpathForOrgCategory += "/" + categoryHierarchical;//$NON-NLS-1$
}
if (!categoryXpathForCurDoc.contains(xpathForOrgCategory)) {
categoryXpathForCurDoc.add(xpathForOrgCategory);
}
}
for (String categoryHierarchical : categoryXpathForOrgDoc) {
createOrReplaceCategory(categoryHierarchical, categoryXpathForCurDoc, root, orgDoc.getRootElement(), serverRoot);
}
}
// success
credentials.get(UnifyUrl(serverRoot.getServerRoot().getWsKey().toString())).doc = orgDoc;
}
private void createOrReplaceCategory(String categoryHierarchical, List<String> categoryXpathForCurDoc, Element srcElem,
Element tgtElem, TreeParent serverRoot) {
if (categoryXpathForCurDoc.contains(categoryHierarchical)) {
// transfer all elements under the imported category to corresponding pos of org doc
transferElementsWithCategoryPath(categoryHierarchical, srcElem, tgtElem);
} else {
String match = "";//$NON-NLS-1$
for (String categoryXpath : categoryXpathForCurDoc) {
if (categoryXpath.startsWith(categoryHierarchical)) {
// transfer all elements under the imported category to corresponding pos of org doc
transferElementsWithCategoryPath(categoryHierarchical, srcElem, tgtElem);
} else if (categoryHierarchical.startsWith(categoryXpath)) {
match = categoryXpath;
}
}
if (match.length() >= 0) {
// create category according to the given xpath
createCategoryForOrgDoc(categoryHierarchical, srcElem, tgtElem, serverRoot);
}
}
}
private void createCategoryForOrgDoc(String categoryToCreate, Element srcElem, Element tgtElem, TreeParent serverRoot) {
String[] xpathSnippetsToCreate = categoryToCreate.split("/");//$NON-NLS-1$
int categoryBeginPos = 3;
if (xpathSnippetsToCreate[3].equals("EventManagement")) {//$NON-NLS-1$
categoryBeginPos = 4;
}
int pos = categoryToCreate.indexOf("/" + xpathSnippetsToCreate[categoryBeginPos]);//$NON-NLS-1$
String categoryXpath = categoryToCreate.substring(0, pos + xpathSnippetsToCreate[categoryBeginPos].length() + 1);
Element subParentElem = pingElement(categoryXpath, tgtElem);
for (int i = categoryBeginPos + 1; i < xpathSnippetsToCreate.length; i++) {
String categoryXpathSnippet = "child::" + xpathSnippetsToCreate[i] + "[text()='" + TreeObject.CATEGORY_FOLDER + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
Element newCategory = pingElement(categoryXpathSnippet, subParentElem);
if (newCategory == null) {
Element existedCategory = pingElement(categoryXpath + "/" + categoryXpathSnippet, srcElem);//$NON-NLS-1$
newCategory = subParentElem.addElement(xpathSnippetsToCreate[i]);
newCategory.setText(TreeObject.CATEGORY_FOLDER + "");//$NON-NLS-1$
newCategory.addAttribute(URL, getURLFromTreeObject(serverRoot));
newCategory.addAttribute(REALNAME, existedCategory.attributeValue(REALNAME));
}
categoryXpath += "/" + xpathSnippetsToCreate[i];//$NON-NLS-1$
subParentElem = newCategory;
}
transferElementsWithCategoryPath(categoryToCreate, srcElem, tgtElem);
}
private Element drillUpForDevisionElement(Element elem) {
Element parent = elem.getParent();
while (parent != null && !parent.getTextTrim().equals(elem.getTextTrim()) && !(parent.getTextTrim().equals("0"))) {//$NON-NLS-1$
parent = parent.getParent();
}
return parent;
}
private void transferElementsWithCategoryPath(String categoryXpath, Element srcElemRoot, Element targtElemRoot) {
categoryXpath += "[text()='" + TreeObject.CATEGORY_FOLDER + "']";//$NON-NLS-1$//$NON-NLS-2$
// clear up the context of targtElemRoot firstly
Element elemCategoryInTagt = pingElement(categoryXpath, targtElemRoot);
List elems = elemCategoryInTagt.content();
List xobjects = new ArrayList();
for (Object obj : elems) {
if (obj instanceof Element) {
Element elem = (Element) obj;
if (!elem.getTextTrim().equals(TreeObject.CATEGORY_FOLDER + "")) {//$NON-NLS-1$
Element division = drillUpForDevisionElement(elem);
division.addElement(elem.getName()).setText(elem.getTextTrim());
xobjects.add(elem);
}
}
}
elemCategoryInTagt.content().removeAll(xobjects);
Element elemCategoryInSrc = pingElement(categoryXpath, srcElemRoot);
elems = elemCategoryInSrc.content();
for (Object obj : elems) {
if (obj instanceof Element) {
Element elem = (Element) obj;
if (!elem.getTextTrim().equals(TreeObject.CATEGORY_FOLDER + "")) {//$NON-NLS-1$
String xpath = ".//descendant::" + elem.getName() + "[text()='" + elem.getTextTrim() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
List<Element> es = targtElemRoot.selectNodes(xpath);
Element newElem = null;
for (Element elemExist : es) {
if (elemExist.getParent() != null
&& elemExist.getParent().getTextTrim().equals(TreeObject.EVENT_MANAGEMENT + "")) {
continue;
}
if (elemExist != null) {
Element parentExist = elemExist.getParent();
parentExist.remove(elemExist);
}
elemExist = pingElement(categoryXpath, targtElemRoot);
newElem = elemExist.addElement(elem.getName());
newElem.setText(elem.getTextTrim());
}
if (es.size() == 0 || (es.size() > 0 && newElem == null)) {
Element elemExist = pingElement(categoryXpath, targtElemRoot);
newElem = elemExist.addElement(elem.getName());
newElem.setText(elem.getTextTrim());
}
}
}
}
}
private Element pingElement(String xpath, Element root) {
List<Element> elems = root.selectNodes(xpath);
if (elems.size() > 0) {
return elems.get(0);
}
return null;
}
private List<String> parseXpathForElement(Element elem, Element subRoot) {
List<String> list = new ArrayList<String>();
while (elem != subRoot) {
if (elem.attributeValue("name") != null) {
list.add(elem.attributeValue("name"));//$NON-NLS-1$
} else {
list.add(elem.getName());
}
elem = elem.getParent();
}
Collections.reverse(list);
return list;
}
public void parseElementForOutput(TreeObject[] xobjs) {
for (TreeObject xobj : xobjs) {
TreeObject subParent = xobj;
while (subParent.getParent().getType() != 0) {
subParent = subParent.getParent();
}
Element modelElem = getParentElement(subParent);
if (!outPutSchemas.containsKey(modelElem.getName())) {
Element copyElem = (Element) modelElem.clone();
copyElem.clearContent();
copyElem.setText(modelElem.getTextTrim());
outPutSchemas.put(modelElem.getName(), copyElem);
}
subParent = xobj;
TreeObject categorySubRoot = null;
while (subParent.getParent().getType() == TreeObject.CATEGORY_FOLDER) {
categorySubRoot = subParent.getParent();
subParent = subParent.getParent();
}
Element divisionElem = null;
Element copyModelElem = outPutSchemas.get(modelElem.getName());
Document doc = credentials.get(UnifyUrl(xobj.getServerRoot().getWsKey().toString())).doc;
String division = xobj.getType() == TreeObject.TRANSFORMER ? "Process" : "Trigger";//$NON-NLS-1$//$NON-NLS-2$
String xpathForDivision = ".//child::" + division + "[text()='" + xobj.getType() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (categorySubRoot != null) {
Element categoryElem = getParentElement(categorySubRoot);
if (categoryElem.getParent() != modelElem) {
divisionElem = pingElement(xpathForDivision, copyModelElem);
if (divisionElem == null) {
divisionElem = copyModelElem.addElement(categoryElem.getParent().getName());
divisionElem.setText(categoryElem.getParent().getTextTrim());
}
} else {
divisionElem = copyModelElem;
}
Element categoryElementClone = (Element) categoryElem.clone();
String xpath = "./child::" + categoryElem.getName() + "[text()='" + TreeObject.CATEGORY_FOLDER + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (divisionElem.selectNodes(xpath).size() == 0) {
divisionElem.add(categoryElementClone);
}
} else {
// individual xobject
Element xobjElem = pingElement(getXPathForTreeObject(xobj), doc.getRootElement());
Element parentElem = xobjElem.getParent();
if (parentElem == modelElem) {
parentElem = copyModelElem;
} else {
divisionElem = pingElement(xpathForDivision, copyModelElem);
if (divisionElem == null) {
divisionElem = copyModelElem.addElement(parentElem.getName());
divisionElem.setText(parentElem.getTextTrim());
}
}
String xpath = ".//child::" + xobjElem.getName() + "[text()='" + xobjElem.getTextTrim() + "']";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (divisionElem != null && pingElement(xpath, divisionElem) == null) {
divisionElem.add((Element) xobjElem.clone());
}
}
}
// filter those excluded from xobjects out of categorys
String xpath = ".//descendant::*[text() ='" + TreeObject.CATEGORY_FOLDER + "']";//$NON-NLS-1$//$NON-NLS-2$
Iterator<Element> iter = outPutSchemas.values().iterator();
while (iter.hasNext()) {
Element divisionElement = iter.next();
List<Element> categorys = divisionElement.selectNodes(xpath);
if (categorys != null) {
for (Element categoryElems : categorys) {
List objs = categoryElems.content();
List<Element> elemToDel = new ArrayList<Element>();
for (Object obj : objs) {
if (obj instanceof Element) {
Element categoryElement = (Element) obj;
if (categoryElement.getTextTrim().equals(TreeObject.CATEGORY_FOLDER + "")) {
continue;
}
boolean match = false;
for (TreeObject xobj : xobjs) {
if (filterOutBlank(xobj.getDisplayName()).equals(categoryElement.getName())
&& categoryElement.getTextTrim().equals(xobj.getType() + "")) {//$NON-NLS-1$
match = true;
break;
}
}
if (!match) {
elemToDel.add(categoryElement);
}
}
}
for (Element del : elemToDel) {
categoryElems.remove(del);
}
}
}
}
ArrayList<String> schemas = new ArrayList<String>();
Iterator<Element> iterd = outPutSchemas.values().iterator();
while (iterd.hasNext()) {
schemas.add(iterd.next().asXML());
}
}
public String[] outPutSchemas() {
ArrayList<String> schemas = new ArrayList<String>();
Iterator<Element> iter = outPutSchemas.values().iterator();
while (iter.hasNext()) {
schemas.add(iter.next().asXML());
}
outPutSchemas.clear();
return schemas.toArray(new String[schemas.size()]);
}
}