blob: 37333d0c948b9e516fcf930e71ca5363b24a4d6e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Matt MacIvor - initial implementation (2.3.3)
******************************************************************************/
package org.eclipse.persistence.internal.oxm.record.namespaces;
import org.eclipse.persistence.internal.oxm.Namespace;
import org.eclipse.persistence.internal.oxm.NamespacePrefixMapper;
import org.eclipse.persistence.oxm.NamespaceResolver;
/**
* INTERNAL:
* <p><b>Purpose:</b> Provides an implementation of NamespaceResolver that wraps a
* NamespacePrefixMapper. This NamespaceResolver initializes itself from the prefixmapper
* and the descriptor's namespace resolver. It's set on a marshal record, when the XMLMarshaller
* is using a custom namespace mapper.
*
*/
public class PrefixMapperNamespaceResolver extends NamespaceResolver {
private NamespacePrefixMapper prefixMapper;
private org.eclipse.persistence.internal.oxm.NamespaceResolver contextualNamespaces;
public PrefixMapperNamespaceResolver(NamespacePrefixMapper mapper, org.eclipse.persistence.internal.oxm.NamespaceResolver nestedResolver) {
prefixMapper = mapper;
String[] declarations = mapper.getContextualNamespaceDecls();
if(declarations != null && declarations.length > 0) {
contextualNamespaces = new NamespaceResolver();
for(int i = 0; i < declarations.length - 1; i += 2) {
String prefix = declarations[i];
String uri = declarations[i + 1];
contextualNamespaces.put(prefix, uri);
}
}
String defaultUri= null;
if(nestedResolver != null){
for(Object next:nestedResolver.getNamespaces()) {
Namespace ns = (Namespace)next;
String uri = ns.getNamespaceURI();
String existingPrefix = null;
if(contextualNamespaces != null) {
existingPrefix = contextualNamespaces.resolveNamespaceURI(uri);
}
//if there's already a prefix for this uri, don't bother adding it
if(existingPrefix == null) {
String originalPrefix = ns.getPrefix();
//ask prefixMapper for a new prefix for this uri
String prefix = prefixMapper.getPreferredPrefix(uri, originalPrefix, true);
if(prefix != null) {
this.put(prefix, uri);
} else {
this.put(originalPrefix, uri);
}
}
}
defaultUri = nestedResolver.getDefaultNamespaceURI();
}
if(defaultUri != null) {
String prefix = prefixMapper.getPreferredPrefix(defaultUri, "", false);
if("".equals(prefix) || prefix == null) {
//Use as default?
this.setDefaultNamespaceURI(defaultUri);
} else {
this.put(prefix, defaultUri);
}
}
String[] uris = mapper.getPreDeclaredNamespaceUris();
if(uris != null && uris.length > 0) {
for(int i = 0; i < uris.length; i++) {
String uri = uris[i];
String prefix = prefixMapper.getPreferredPrefix(uri, null, true);
if(prefix != null) {
this.put(prefix, uri);
} else {
this.put(this.generatePrefix(), uri);
}
}
}
declarations = prefixMapper.getPreDeclaredNamespaceUris2();
if(declarations != null && declarations.length > 0) {
for(int i = 0; i < declarations.length - 1; i += 2) {
String prefix = declarations[i];
String uri = declarations[i + 1];
this.put(prefix, uri);
}
}
}
@Override
public String resolveNamespaceURI(String uri) {
String prefix = null;
if(contextualNamespaces != null) {
prefix = contextualNamespaces.resolveNamespaceURI(uri);
}
if(prefix == null) {
prefix = super.resolveNamespaceURI(uri);
}
return prefix;
}
@Override
public void put(String prefix, String uri) {
String newPrefix = prefixMapper.getPreferredPrefix(uri, prefix, true);
if(newPrefix == null || newPrefix.length() == 0) {
super.put(prefix, uri);
} else {
super.put(newPrefix, uri);
}
}
public NamespacePrefixMapper getPrefixMapper() {
return this.prefixMapper;
}
}