blob: fd4d9b87fac08b35e365f3f86ba5e364e93b3045 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.internal.core;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.xwt.IConstants;
import org.eclipse.xwt.Tracking;
import org.eclipse.xwt.XWT;
import org.eclipse.xwt.internal.utils.LoggerManager;
import org.eclipse.xwt.internal.utils.ObjectUtil;
import org.eclipse.xwt.internal.xml.Attribute;
import org.eclipse.xwt.internal.xml.Element;
import org.eclipse.xwt.jface.JFacesHelper;
/**
* @author liang.zhang
*
*/
public class DataBindingTrack {
private String bindingError = "";
private Set<String> errorElements = null;
private List<Element> widgetList = null;
private Map<Element, String> bindingMap;
public DataBindingTrack() {
widgetList = new ArrayList<Element>();
errorElements = new HashSet<String>();
bindingMap = new HashMap<Element, String>();
}
public void addWidgetElement(Element element) {
widgetList.add(element);
}
private void addErrorWidgetId(String elementId) {
errorElements.add(elementId);
}
private void addBindingMessageToMap(Element element, String bindingMessage) {
bindingMap.put(element, bindingMessage);
}
private int validateParentElementError(Element bindingElement) {
int isError = 0;
if (!bindingError.equals("")) {
Object parentObj = bindingElement.getParent();
while (parentObj != null) {
bindingElement = (Element) parentObj;
if (errorElements.contains(bindingElement.getId())) {
isError = 1;
break;
}
parentObj = bindingElement.getParent();
}
}
return isError;
}
private String getCurrentWidgetPosition(Element element) {
if (element.getParent() != null) {
return " " + getCurrentWidgetPosition((Element) element.getParent());
}
return "";
}
public String getDataBindMessage() {
StringBuffer message = new StringBuffer("");
Iterator<Element> widgetIt = widgetList.iterator();
Set<Element> keys = bindingMap.keySet();
while (widgetIt.hasNext()) {
Element element = widgetIt.next();
int parentHasError = validateParentElementError(element);
if (parentHasError == 0) {
String content = getCurrentWidgetPosition(element);
if (!message.toString().equals("")) {
content += "+ ";
}
content = content + element.getName();
if (XWT.isTracking(Tracking.NAME)) {
Attribute nameAttr = element.getAttribute("Name");
if (nameAttr == null) {
nameAttr = element.getAttribute(IConstants.XWT_X_NAMESPACE, "Name");
}
if (nameAttr != null) {
content += " <" + nameAttr.getContent() + ">";
}
}
message.append(content);
if (XWT.isTracking(Tracking.DATABINDING)) {
if (keys.contains(element)) {
message.append(bindingMap.get(element));
} else {
message.append("\n");
}
}
}
}
return message.toString();
}
private void setBindingErrorMessage(String bindingError) {
this.bindingError = bindingError;
}
public void tracking(Object swtObject, Element element, Object dataContext) {
String bindingMessage = "";
if (swtObject instanceof Binding) {
String error = "";
Binding newInstance = (Binding) swtObject;
String path = null;
Attribute attr = element.getAttribute("Path");
if (null == attr)
attr = element.getAttribute("path");
if (null != attr)
path = attr.getContent();
Object dataContext2 = null;
try {
dataContext2 = newInstance.getValue(null);
if (path != null && path.length() > 0) {
String[] paths = path.trim().split("\\.");
if (paths.length > 1) {
String path1 = "";
for (int i = 0; i < paths.length - 1; i++) {
path1 = paths[i];
if (dataContext2 != null) {
dataContext2 = getObserveData(dataContext2, path1);
}
}
}
}
} catch (Exception ex) {
addErrorWidgetId(element.getParent().getParent().getId());
setBindingErrorMessage("-> Error");
error = "-> Error";
}
if (dataContext2 != null) {
bindingMessage = " (DataContext=" + dataContext2.getClass().getSimpleName() + ", Path=" + path + ")" + error + "\n";
addBindingMessageToMap((Element) element.getParent().getParent(), bindingMessage);// bindingMap.put((Element) element.getParent().getParent(), bindingMessage);
}
} else if (swtObject instanceof Widget) {
addWidgetElement(element);
if (dataContext != null) {
bindingMessage = " (DataContext=" + dataContext.getClass().getSimpleName() + ")\n";
addBindingMessageToMap(element, bindingMessage);
}
} else if (JFacesHelper.isViewer(swtObject)) {
if (dataContext != null) {
bindingMessage = " (DataContext=" + dataContext.getClass().getSimpleName() + ")\n";
addBindingMessageToMap(element, bindingMessage);// bindingMap.put(element, bindingMessage);
}
} else if (element.attributeNames(IConstants.XWT_X_NAMESPACE).length > 0) {
// ??
if (element.getParent() != null && element.getParent().getParent() != null) {
bindingMessage = " (DataContext=" + element.getName() + ")\n";
addBindingMessageToMap((Element) element.getParent().getParent(), bindingMessage);// bindingMap.put((Element) element.getParent().getParent(), bindingMessage);
}
}
}
public static Object getObserveData(Object dataContext, String path) {
try {
Class<?> dataContextClass = dataContext.getClass();
Method getMethod = ObjectUtil.findGetter(dataContextClass, path, null);
if (getMethod != null) {
return getMethod.invoke(dataContext);
}
} catch (SecurityException e) {
LoggerManager.log(e);
} catch (IllegalArgumentException e) {
LoggerManager.log(e);
} catch (IllegalAccessException e) {
LoggerManager.log(e);
} catch (InvocationTargetException e) {
LoggerManager.log(e);
}
return null;
}
}