blob: ab430b2275278bc982ffdc0192f167aae01c474f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpmn2.modeler.core.adapters;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Element;
/**
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Jul 23, 2007
*
*/
public class BasicEObjectAdapter extends AbstractStatefulAdapter
implements IProperty<String, Object>, INamespaceMap<String, String> {
/**
* For generic properties associated with an EObject; this are transient and
* not saved
*/
Map<String, Object> fProperties = null;
/** Forward, prefix to namespace map. */
Map<String, String> fPrefix2Namespace = null;
/** Reverse, Namespace to list of prefixes */
Map<String, List<String>> fNamespace2Prefix = null;
/**
* @param key
* the key
* @return the value
* @see org.eclipse.bpel.model.adapters.IProperty#getProperty(java.lang.Object)
*/
public Object getProperty(String key) {
return fProperties == null ? null : fProperties.get(key);
}
/**
* Set the value under the key key. Previous value is returned.
*
* @param key
* the key
* @param value
* the new value
* @return the previous value, if set.
* @see org.eclipse.bpel.model.adapters.IProperty#setProperty(java.lang.Object,
* java.lang.Object)
*/
public Object setProperty(String key, Object value) {
if (fProperties == null) {
fProperties = new HashMap<String, Object>(5);
}
return fProperties.put(key, value);
}
/**
*
* @param key
* the namespace to get the reverse mapping for
* @return The reverse mapping of the Namespace to namespace prefixes.
* @see org.eclipse.bpel.model.adapters.INamespaceMap#getReverse(java.lang.Object)
*/
public List<String> getReverse(String key) {
return getReverse4(key);
}
/**
* @see java.util.Map#clear()
*/
public void clear() {
if (fNamespace2Prefix != null) {
fNamespace2Prefix.clear();
}
if (fPrefix2Namespace != null) {
fPrefix2Namespace.clear();
}
}
/**
* @see java.util.Map#containsKey(java.lang.Object)
*/
public boolean containsKey(Object key) {
return fPrefix2Namespace != null ? fPrefix2Namespace.containsKey(key)
: false;
}
/**
* @see java.util.Map#containsValue(java.lang.Object)
*/
public boolean containsValue(Object value) {
return fPrefix2Namespace != null ? fPrefix2Namespace
.containsValue(value) : false;
}
/**
* @see java.util.Map#entrySet()
*/
public Set<java.util.Map.Entry<String, String>> entrySet() {
if (fPrefix2Namespace == null) {
return Collections.emptySet();
}
return fPrefix2Namespace.entrySet();
}
/**
* @see java.util.Map#get(java.lang.Object)
*/
public String get(Object key) {
return fPrefix2Namespace != null ? fPrefix2Namespace.get(key) : null;
}
/**
* @see java.util.Map#isEmpty()
*/
public boolean isEmpty() {
return fPrefix2Namespace != null ? fPrefix2Namespace.isEmpty() : true;
}
/**
* @see java.util.Map#keySet()
*/
public Set<String> keySet() {
if (fPrefix2Namespace == null) {
return Collections.emptySet();
}
return fPrefix2Namespace.keySet();
}
/**
* @param key
* the key to set
* @param value
* the value to set.
* @return the old value, if set
* @see java.util.Map#put(java.lang.Object, java.lang.Object)
*/
public String put(String key, String value) {
fPrefix2Namespace = getPrefix2NamespaceMap();
String oldValue = fPrefix2Namespace.put(key, value);
// when we put something, the reverse value may not yet exist.
List<String> ns2pfx = getReverse4(value);
if (ns2pfx.contains(key) == false) {
ns2pfx.add(key);
}
//
if (getTarget() instanceof WSDLElement) {
Element element = ((WSDLElement) getTarget()).getElement();
// Element could be null (for instance, on load)
if (element != null) {
String attr = key.equals("") ? "xmlns" : "xmlns:" + key;
// We only need to update attribute if something really has been changed
// because it causes hard reconcile process
if ((oldValue == null && value != null) || (oldValue != null && !oldValue.equals(value))) {
String attribute = element.getAttribute(attr);
if ((attribute == null && value != null) || (attribute != null && !attribute.equals(value))) {
element.setAttribute(attr, value);
}
}
}
}
return oldValue;
}
/**
* @see java.util.Map#putAll(java.util.Map)
*/
public void putAll(Map<? extends String, ? extends String> t) {
fPrefix2Namespace.putAll(t);
}
/**
* @see java.util.Map#remove(java.lang.Object)
*/
public String remove(Object key) {
if (fPrefix2Namespace == null) {
return null;
}
String value = fPrefix2Namespace.remove(key);
// the key did not exist.
if (value == null) {
return value;
}
// the key did exist, remove it from the reverse mapping as well.
// the reverse mapping must exist in this case.
fNamespace2Prefix.get(value).remove(key);
if (getTarget() instanceof WSDLElement) {
Element element = ((WSDLElement) getTarget()).getElement();
// Element could be null (for instance, on load)
if (element != null) {
element.removeAttributeNS(XSDConstants.XMLNS_URI_2000, key.toString());
}
}
return value;
}
/**
* @see java.util.Map#size()
*/
public int size() {
return fPrefix2Namespace != null ? fPrefix2Namespace.size() : 0;
}
/**
* @see java.util.Map#values()
*/
public Collection<String> values() {
if (fPrefix2Namespace == null) {
return Collections.emptyList();
}
return fPrefix2Namespace.values();
}
Map<String, String> getPrefix2NamespaceMap() {
if (fPrefix2Namespace == null) {
fPrefix2Namespace = new HashMap<String, String>(5);
}
return fPrefix2Namespace;
}
List<String> getReverse4(String key) {
if (fNamespace2Prefix == null) {
fNamespace2Prefix = new HashMap<String, List<String>>(5);
}
List<String> prefixes = fNamespace2Prefix.get(key);
if (prefixes == null) {
prefixes = new ArrayList<String>();
fNamespace2Prefix.put(key, prefixes);
}
return prefixes;
}
}