package org.jvnet.jaxb2_commons.xml.bind.model.util; import java.util.HashMap; import java.util.Map; import javax.xml.namespace.QName; import org.jvnet.jaxb2_commons.lang.StringUtils; import org.jvnet.jaxb2_commons.lang.Validate; import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo; public class PackageInfoQNameAnalyzer<T, C> { private final MModelInfo<T, C> modelInfo; public PackageInfoQNameAnalyzer(MModelInfo<T, C> modelInfo) { Validate.notNull(modelInfo); this.modelInfo = modelInfo; } public String getMostUsedElementNamespaceURI(MPackageInfo packageInfo) { final NamespaceURICounter counter = new NamespaceURICounter(); final QNameCollector collector = new QNameCollector() { public void element(QName name) { counter.add(name.getNamespaceURI()); } public void attribute(QName name) { } }; collectNamespaceURIs(packageInfo, collector); return counter.getMostUsedNamespaceURI(); } public String getMostUsedAttributeNamespaceURI(MPackageInfo packageInfo) { final NamespaceURICounter counter = new NamespaceURICounter(); final QNameCollector collector = new QNameCollector() { public void element(QName name) { } public void attribute(QName name) { counter.add(name.getNamespaceURI()); } }; collectNamespaceURIs(packageInfo, collector); return counter.getMostUsedNamespaceURI(); } private void collectNamespaceURIs(MPackageInfo packageInfo, final QNameCollector collector) { for (MElementInfo<T, C> elementInfo : modelInfo.getElementInfos()) { if (elementInfo.getPackageInfo() == packageInfo) { collector.element(elementInfo.getElementName()); } } final QNameCollectingPropertyInfoVisitor<T, C> visitor = new QNameCollectingPropertyInfoVisitor<T, C>( collector); for (MClassInfo<T, C> classInfo : modelInfo.getClassInfos()) { if (classInfo.getPackageInfo() == packageInfo) { for (MPropertyInfo<T, C> propertyInfo : classInfo .getProperties()) { propertyInfo.acceptPropertyInfoVisitor(visitor); } } } } private static class NamespaceURICounter { private Map<String, Integer> map = new HashMap<String, Integer>(); public void add(String namespaceURI) { final Integer count = map.get(namespaceURI); if (count == null) { map.put(namespaceURI, Integer.valueOf(1)); } else { map.put(namespaceURI, Integer.valueOf(count.intValue() + 1)); } } public String getMostUsedNamespaceURI() { String namespaceURI = null; int count = 0; for (Map.Entry<String, Integer> e : map.entrySet()) { final String currentNamespaceURI = e.getKey(); final int currentCount = e.getValue(); if (namespaceURI == null) { namespaceURI = currentNamespaceURI; count = currentCount; } else { if (currentCount > count || (currentCount == count && namespaceURI == null)) { namespaceURI = currentNamespaceURI; count = currentCount; } } } return StringUtils.isEmpty(namespaceURI) ? null : namespaceURI; } } }