blob: 6436747005aebba9d66980c1ef2d1d485d57f52c [file] [log] [blame]
package org.eclipse.epf.library.edit.uma;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.epf.library.edit.util.MethodElementPropUtil;
import org.eclipse.epf.library.edit.util.XmlEditUtil;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.UmaPackage;
import org.w3c.dom.Element;
public class ExtendReferenceMap {
//Reference names
public static final String UtdList = "udtList"; //$NON-NLS-1$
public static String[] names = {
UtdList,
};
private Map<String, Object> map;
private Map<String, Object> oldValueMap;
public ExtendReferenceMap() {
}
public void retrieveReferencesFromElement(Element element) {
for (String name : names) {
String value = element.getAttribute(name);
if (value == null || value.length() == 0) {
continue;
}
List<Practice> items = (List<Practice>) XmlEditUtil.convertToMethodElements(value, UmaPackage.eINSTANCE.getPractice());
if (items != null && !items.isEmpty()) {
getMap().put(name, items);
}
}
}
public Object get(String name, boolean toModify) {
if (!toModify && map == null) {
return null;
}
Object value = getMap().get(name);
if (isMany(name) && toModify) {
if (value == null) {
value = new MeList();
getMap().put(name, value);
}
if (value instanceof MeList) {
Object oldValue = ((MeList) value).clone();
getOldValueMap().put(name, oldValue);
}
}
return value;
}
public void set(String name, Object value) {
Object oldValue = get(name, false);
if (oldValue instanceof MeList) {
oldValue = ((MeList) oldValue).clone();
}
getOldValueMap().put(name, oldValue);
getMap().put(name, value);
}
private Map<String, Object> getMap() {
if (map == null) {
map = new HashMap<String, Object>();
}
return map;
}
private Map<String, Object> getOldValueMap() {
if (oldValueMap == null) {
oldValueMap = new HashMap<String, Object>();
}
return oldValueMap;
}
public void storeReferencesToElement(Element element) {
storeReferencesToElement(element, false);
getOldValueMap().clear();
}
public void storeReferencesToElement(Element element, boolean rollback) {
for (String name : names) {
Object value = get(name, false);
if (rollback && getOldValueMap().containsKey(name)) {
value = getOldValueMap().get(name);
if (value == null) {
getMap().remove(name);
} else {
getMap().put(name, value);
}
}
if (value instanceof MethodElement) {
MethodElement eValue = (MethodElement) value;
element.setAttribute(name, eValue.getGuid());
} else if (value instanceof List) {
String str = ""; //$NON-NLS-1$
for (Object item : (List) value) {
if (item instanceof MethodElement) {
MethodElement eValue = (MethodElement) item;
if (str.length() > 0) {
str += MethodElementPropUtil.infoSeperator;
}
str += eValue.getGuid();
}
}
element.setAttribute(name, str);
}
}
if (rollback) {
getOldValueMap().clear();
}
}
public static String getOppositeName(String name) {
return "opposite_" + name; //$NON-NLS-1$
}
public boolean isMany(String name) {
return true;
}
private static class MeList extends ArrayList {
private boolean hasUnresolved = false;
public boolean isHasUnresolved() {
return hasUnresolved;
}
public void setHasUnresolved(boolean hasUnresolved) {
this.hasUnresolved = hasUnresolved;
}
}
}