package org.objectstyle.wolips.eomodeler.core.model;
import java.util.HashMap;
import java.util.Map;
import org.objectstyle.wolips.eomodeler.core.utils.NotificationMap;
import com.uwyn.rife.tools.ObjectUtils;
public abstract class UserInfoableEOModelObject<T> extends EOModelObject<T> implements IUserInfoable, Cloneable {
public static final String ENTITY_MODELER_KEY = "_EntityModeler";
public static final String DOCUMENTATION_KEY = "documentation";
public static final String USER_INFO = "userInfo";
private PropertyChangeRepeater _userInfoRepeater;
private NotificationMap<Object, Object> _userInfo;
public UserInfoableEOModelObject() {
_userInfoRepeater = new PropertyChangeRepeater(UserInfoableEOModelObject.USER_INFO);
setUserInfo(new NotificationMap<Object, Object>(), false);
}
public NotificationMap<Object, Object> getUserInfo() {
return _userInfo;
}
public void setUserInfo(Map<Object, Object> userInfo) {
setUserInfo(userInfo, true);
}
public void setUserInfo(Map<Object, Object> userInfo, boolean fireEvents) {
_userInfo = mapChanged(_userInfo, userInfo, _userInfoRepeater, fireEvents);
}
public void userInfoChanged(String path, Object oldValue, Object newValue) {
firePropertyChange(UserInfoableEOModelObject.USER_INFO + "." + path, oldValue, newValue);
}
public EOModelMap getEntityModelerMap(boolean readWrite) {
NotificationMap<Object, Object> userInfo = getUserInfo();
Map entityModelerMap = (Map) userInfo.get(UserInfoableEOModelObject.ENTITY_MODELER_KEY);
if (entityModelerMap == null) {
entityModelerMap = new HashMap<Object, Object>();
if (readWrite) {
userInfo._putWithoutEvents(UserInfoableEOModelObject.ENTITY_MODELER_KEY, entityModelerMap);
}
}
return new EOModelMap(entityModelerMap);
}
/**
* Sets the documentation field on this object. documentation writes
* into userInfo=>_EntityModeler=>Documentation.
*
* @param documentation the documentation for this object
*/
public void setDocumentation(String documentation) {
String oldDocumentation = getDocumentation();
EOModelMap entityModelerMap = getEntityModelerMap(true);
if (documentation == null) {
entityModelerMap.remove(UserInfoableEOModelObject.DOCUMENTATION_KEY);
} else {
entityModelerMap.put(UserInfoableEOModelObject.DOCUMENTATION_KEY, documentation);
}
firePropertyChange(UserInfoableEOModelObject.DOCUMENTATION_KEY, oldDocumentation, documentation);
}
/**
* Returns the documentation for this object.
*
* @return the documentation for this object
*/
public String getDocumentation() {
EOModelMap entityModelerMap = getEntityModelerMap(false);
String documentation = (String) entityModelerMap.get(UserInfoableEOModelObject.DOCUMENTATION_KEY);
return documentation;
}
protected void writeUserInfo(EOModelMap modelMap) {
EOModelMap entityModelerMap = getEntityModelerMap(false);
if (entityModelerMap.isEmpty()) {
getUserInfo()._removeWithoutEvents(UserInfoableEOModelObject.ENTITY_MODELER_KEY);
} else {
getUserInfo()._putWithoutEvents(UserInfoableEOModelObject.ENTITY_MODELER_KEY, entityModelerMap);
}
modelMap.setMap("userInfo", _userInfo, true);
modelMap.remove("userDictionary");
}
protected void loadUserInfo(EOModelMap modelMap) {
if (modelMap.containsKey("userDictionary")) {
setUserInfo(modelMap.getMap("userDictionary", true), false);
} else {
setUserInfo(modelMap.getMap("userInfo", true), false);
}
}
protected void _cloneUserInfoInto(UserInfoableEOModelObject<T> obj) {
try {
obj.setUserInfo(ObjectUtils.deepClone(_userInfo));
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Failed to clone user info: " + obj + ".", e);
}
}
}