/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.util; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; import org.jboss.tools.common.model.XModelObject; public class NamespaceMapping { public static String ATTR_NAMESPACE_MAPPING = "namespaceMapping"; //$NON-NLS-1$ Map<String, String> defaultToActual = new HashMap<String, String>(); Map<String, String> actualToDefault = new HashMap<String, String>(); Map<String, String> defaultToURI = new HashMap<String, String>(); Map<String, String> defaultToActualCache = new HashMap<String, String>(); Map<String, String> actualToDefaultCache = new HashMap<String, String>(); public NamespaceMapping() {} public void addNamespace(String defaultNamespace, String actualNamespace, String uri) { defaultToActual.put(defaultNamespace, actualNamespace); actualToDefault.put(actualNamespace, defaultNamespace); defaultToURI.put(defaultNamespace, uri); } public String getActualNamespace(String defaultNamespace) { return defaultToActual.get(defaultNamespace); } public String getDefaultNamespace(String actualNamespace) { return actualToDefault.get(actualNamespace); } public String getURIForDefaultNamespace(String defaultNamespace) { return defaultNamespace == null ? null : defaultToURI.get(defaultNamespace); } public String getURIForActualNamespace(String actualNamespace) { String defaultNamespace = getDefaultNamespace(actualNamespace); return getURIForDefaultNamespace(defaultNamespace); } public String convertToDefault(String name) { if(name.indexOf(':') < 0) return name; String value = actualToDefaultCache.get(name); if(value != null) return value; int i = name.indexOf(':'); String a = name.substring(0, i); String d = getDefaultNamespace(a); if(d == null || a.equals(d)) { value = name; } else { value = d + name.substring(i); } defaultToActualCache.put(name, value); return value; } public String convertToActual(String name) { if(name.indexOf(':') < 0) return name; String value = defaultToActualCache.get(name); if(value != null) return value; StringBuffer res = new StringBuffer(); if(name.indexOf('|') >= 0) { StringTokenizer st = new StringTokenizer(name, "|"); //$NON-NLS-1$ int i = 0; while(st.hasMoreTokens()) { String t = st.nextToken(); if(i > 0) res.append('|'); t = convertToActual(t); res.append(t); i++; } } else if(name.indexOf('.') >= 0) { StringTokenizer st = new StringTokenizer(name, "."); //$NON-NLS-1$ int i = 0; while(st.hasMoreTokens()) { String t = st.nextToken(); if(i > 0) res.append('.'); t = convertToActual(t); res.append(t); i++; } } else { int i = name.indexOf(':'); String d = name.substring(0, i); String a = getActualNamespace(d); if(a == null || a.equals(name)) { res.append(name); } else { res.append(a).append(name.substring(i)); } } value = res.toString(); defaultToActualCache.put(name, value); return value; } public String toString() { StringBuffer sb = new StringBuffer(); Iterator<String> i = defaultToActual.keySet().iterator(); while(i.hasNext()) { String d = i.next(); String a = defaultToActual.get(d); String u = defaultToURI.get(d); sb.append(d).append(' ').append(a).append(' ').append(u).append(' '); } return sb.toString(); } public static NamespaceMapping load(XModelObject file) { String nms = file.get(ATTR_NAMESPACE_MAPPING); return nms == null ? null : load(nms); } public static NamespaceMapping load(String s) { if(s == null || s.length() == 0) return null; NamespaceMapping m = new NamespaceMapping(); StringTokenizer st = new StringTokenizer(s, " "); //$NON-NLS-1$ while(st.hasMoreTokens()) { String d = st.nextToken(); String a = st.hasMoreTokens() ? st.nextToken() : d; String u = st.hasMoreTokens() ? st.nextToken() : "http://"; //$NON-NLS-1$ m.addNamespace(d, a, u); } return m; } }