Package org.apache.flex.compiler.common

Source Code of org.apache.flex.compiler.common.Multiname

/*
*
*  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 org.apache.flex.compiler.common;

import java.util.HashSet;
import java.util.Set;

import org.apache.flex.abc.semantics.Name;
import org.apache.flex.abc.semantics.Namespace;
import org.apache.flex.abc.semantics.Nsset;
import org.apache.flex.compiler.definitions.INamespaceDefinition;
import org.apache.flex.compiler.internal.definitions.NamespaceDefinition;
import org.apache.flex.compiler.internal.workspaces.Workspace;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.workspaces.IWorkspace;

public final class Multiname
{
    /**
     * Constructs a {@link Multiname} by parsing the specified name string.
     *
     * @param project {@link ICompilerProject} whose {@link IWorkspace} is used
     * to create package namespace definitions.
     * @param name Either a simple definition name or a dotted qname.
     * @return A new {@link Multiname} created from information in the specified
     * name
     */
    public static Multiname crackDottedQName(ICompilerProject project, String name)
    {
        return crackDottedQName(project, name, false);
    }
   
    /**
     * Constructs a {@link Multiname} by parsing the specified name string.
     *
     * @param project {@link ICompilerProject} whose {@link IWorkspace} is used
     * to create package namespace definitions.
     * @param name Either a simple definition name or a dotted qname.
     * @param includeInternal true if package internal namespaces should be in
     * the namespace set in the multiname.
     * @return A new {@link Multiname} created from information in the specified
     * name
     */
    public static Multiname crackDottedQName(ICompilerProject project, String name, boolean includeInternal)
    {
        Workspace workspace = (Workspace)project.getWorkspace();
        final Set<INamespaceDefinition> namespaceSet = new HashSet<INamespaceDefinition>(includeInternal ? 2 : 1);
        if (name != null)
        {
            int lastIndexOfDot = name != null ? name.lastIndexOf('.') : -1;
            if (lastIndexOfDot != -1)
            {
                final String definitionName = name.substring(lastIndexOfDot + 1);
                final String packageName = name.substring(0, lastIndexOfDot);
                INamespaceDefinition publicPackageNS =
                    workspace.getPackageNamespaceDefinitionCache().get(packageName, false);
                namespaceSet.add(publicPackageNS);
                if (includeInternal)
                {
                    INamespaceDefinition internalPackageNS =
                        workspace.getPackageNamespaceDefinitionCache().get(packageName, true);
                    namespaceSet.add(internalPackageNS);           
                }
                return new Multiname(namespaceSet, definitionName);
            }
        }

        final INamespaceDefinition publicPackageNS = NamespaceDefinition.getPublicNamespaceDefinition();
        namespaceSet.add(publicPackageNS);
        if (includeInternal)
        {
            INamespaceDefinition internalPackageNS =
                workspace.getPackageNamespaceDefinitionCache().get("", true);
            namespaceSet.add(internalPackageNS);           
        }
        return new Multiname(namespaceSet, name);
    }

    /**
     * Returns the package name part of a dotted fully qualified AS3 name. One
     * thing this method is used for is to compute package names of mxml
     * classes.
     *
     * @param name A dotted fully qualified AS3 name
     * @return The package name in the specified name.
     */
    public static String getPackageNameForQName(String name)
    {
        if (name == null)
            return "";
        int lastIndexOfDot = name.lastIndexOf('.');
        if (lastIndexOfDot != -1)
            return name.substring(0, lastIndexOfDot);
        return "";
    }
   
    /**
     * Returns the base name part of a dotted fully qualified AS3 name.
     *
     * @param name A dotted fully qualified AS3 name
     * @return The base name in the specified name.
     */
    public static String getBaseNameForQName(String name)
    {
        int lastIndexOfDot = name.lastIndexOf('.');
        if (lastIndexOfDot != -1)
            return name.substring(lastIndexOfDot + 1);
        return name;
    }
   
    public static Multiname create(Set<INamespaceDefinition> nsset, String baseName)
    {
        return new Multiname(nsset, baseName);
    }
   
    public Multiname(Set<INamespaceDefinition> namespaceSet, String baseName)
    {
        this.namespaceSet = namespaceSet;
        this.baseName = baseName;
    }
   
    private final Set<INamespaceDefinition> namespaceSet;
    private final String baseName;
   
    /**
     * Gets the namespace set for this {@link Multiname}.
     * @return The namespace set for this {@link Multiname}.
     */
    public Set<INamespaceDefinition> getNamespaceSet()
    {
        return namespaceSet;
    }
   
    /**
     * Gets the base name for this {@link Multiname}.
     * @return The base name set for this {@link Multiname}.
     */
    public String getBaseName()
    {
        return baseName;
    }
   
    /**
     * Gets the AET name for this {@link Multiname}.
     * @return A {@link Name} object.
     */
    public Name getMName()
    {
        Set<Namespace> namespaces = new HashSet<Namespace>(namespaceSet.size());
        for ( INamespaceDefinition ns: namespaceSet )
            namespaces.add( ((NamespaceDefinition)ns).getAETNamespace() );

        return new Name(new Nsset(namespaces), getBaseName());
    }
   
    /**
     * For debugging only.
     * <p>
     * {@inheritDoc}
     */
    @Override
    public String toString()
    {
        StringBuilder builder = new StringBuilder();
        builder.append('[');
        for (INamespaceDefinition namespace : namespaceSet)
        {
            builder.append(namespace.toString());
            builder.append(", ");
        }
        builder.append("]::");
        builder.append(baseName);
        return builder.toString();
    }
}
TOP

Related Classes of org.apache.flex.compiler.common.Multiname

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.