be.selckin.ws.util.java2php.NameManager.java Source code

Java tutorial

Introduction

Here is the source code for be.selckin.ws.util.java2php.NameManager.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package be.selckin.ws.util.java2php;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.service.model.SchemaInfo;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.ws.commons.schema.utils.NamespacePrefixList;

import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class NameManager {

    private Map<String, String> nsPrefixMap;

    /**
     * @param service
     * @param endpoint
     * @return
     */
    public static NameManager newNameManager(ServiceInfo service, Endpoint endpoint) {
        NameManager nameManager = new NameManager();
        nameManager.initialize(service);
        return nameManager;
    }

    private void initialize(ServiceInfo service) {
        nsPrefixMap = new HashMap<String, String>();

        Set<String> poorPrefixURIs = new HashSet<String>();
        for (SchemaInfo schemaInfo : service.getSchemas()) {
            NamespacePrefixList schemaPrefixList = schemaInfo.getSchema().getNamespaceContext();
            for (String declaredPrefix : schemaPrefixList.getDeclaredPrefixes()) {
                String uri = schemaPrefixList.getNamespaceURI(declaredPrefix);

                if (!nsPrefixMap.containsKey(uri)) { // first schema to define a prefix wins.
                    if (declaredPrefix.startsWith("ns") || "tns".equals(declaredPrefix)) {
                        poorPrefixURIs.add(uri);
                    } else {
                        nsPrefixMap.put(uri, declaredPrefix.toUpperCase());
                    }
                }
            }
        }

        for (String uri : poorPrefixURIs) {
            defineFallbackPrefix(uri);
        }
    }

    /**
     * Take a URI and turn it into a JavaScript name prefix.
     *
     * @param uri input URI.
     * @return output prefix.
     */
    protected String transformURI(String uri) {
        return uri.replaceAll("http:/*", "").replace("uri:", "").replaceAll("[\\.:/-]", "\\\\");
    }

    private String defineFallbackPrefix(String uri) {
        // this needs more work later. We are bound to annoy someone somehow in this area.
        String jsPrefix = transformURI(uri);
        nsPrefixMap.put(uri, jsPrefix);
        return jsPrefix;
    }

    public String getPhpNamespace(QName qname) {
        String nsprefix = nsPrefixMap.get(qname.getNamespaceURI());
        // nsprefix will be null if there is no prefix.
        if (nsprefix == null) {
            nsprefix = defineFallbackPrefix(qname.getNamespaceURI());
        }

        String[] separated = nsprefix.split("\\\\");
        CollectionUtils.reverseArray(separated);
        return StringUtils.join(separated, "\\");
    }

    public String getPhpClassName(QName qname) {
        return StringUtils.capitalize(qname.getLocalPart());
    }

    public String getPhpName(QName qname) {
        return qname.getLocalPart();
    }

    public String getAbsolutePhpClassName(QName qName) {
        return "\\" + getPhpNamespace(qName) + "\\" + getPhpClassName(qName);
    }
}