All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.packagedrone.utils.Headers Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2014 IBH SYSTEMS GmbH.
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     IBH SYSTEMS GmbH - initial API and implementation
 *******************************************************************************/
package org.eclipse.packagedrone.utils;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

public final class Headers
{
    private Headers ()
    {
    }

    public static List parseList ( final String string )
    {
        if ( string == null )
        {
            return null;
        }

        final List result = new LinkedList<> ();

        for ( final String tok : split ( string, ',' ) )
        {
            result.add ( parse ( tok ) );
        }

        return result;
    }

    public static > T parseStringCollection ( final String string, final Supplier provider )
    {
        final List result = parseList ( string );
        if ( result == null )
        {
            return null;
        }

        final T col = provider.get ();

        for ( final AttributedValue av : result )
        {
            col.add ( av.getValue () );
        }

        return col;
    }

    public static List parseStringList ( final String string )
    {
        return parseStringCollection ( string, LinkedList::new );
    }

    public static Set parseStringSet ( final String string )
    {
        return parseStringCollection ( string, HashSet::new );
    }

    public static AttributedValue parse ( final String string )
    {
        if ( string == null )
        {
            return null;
        }

        final String[] toks = segments ( string );

        if ( toks.length == 1 )
        {
            return new AttributedValue ( toks[0] );
        }
        else
        {
            return new AttributedValue ( toks[0], splitAttributes ( 1, toks ) );
        }
    }

    public static Map splitAttributes ( final int skipToks, final String[] toks )
    {
        final Map result = new HashMap<> ();

        for ( int i = skipToks; i < toks.length; i++ )
        {
            parseToken ( toks[i], result );
        }

        return result;
    }

    private static void parseToken ( final String v, final Map result )
    {
        final StringBuilder key = new StringBuilder ();
        StringBuilder value = null;

        Character quote = null;

        int pos = 0;
        while ( pos < v.length () )
        {
            final char c = v.charAt ( pos );
            final Character next = pos + 1 < v.length () ? v.charAt ( pos + 1 ) : null;

            if ( quote == null )
            {
                if ( c == '"' )
                {
                    quote = c;
                }
                else if ( value != null )
                {
                    value.append ( c );
                }
                else if ( c == ':' && next != null && next.charValue () == '=' )
                {
                    value = new StringBuilder ();
                    pos++; // skip one char
                }
                else if ( c == '=' )
                {
                    value = new StringBuilder ();
                }
                else
                {
                    key.append ( c );
                }
            }
            else
            {
                if ( c == quote )
                {
                    quote = null;
                }
                else if ( value != null )
                {
                    value.append ( c );
                }
                else
                {
                    key.append ( c );
                }

            }
            pos++;
        }

        // return result

        if ( key.length () <= 0 )
        {
            return;
        }

        if ( value != null )
        {
            result.put ( key.toString (), value.toString () );
        }
        else
        {
            final String kv = key.toString ();
            result.put ( kv, kv );
        }
    }

    public static String[] segments ( final String string )
    {
        return split ( string, ';' );
    }

    public static String[] split ( final String string, final char delimiter )
    {
        final List result = new LinkedList ();

        int pos = 0;

        Character quote = null;
        StringBuilder sb = new StringBuilder ();
        while ( pos < string.length () )
        {
            final char c = string.charAt ( pos );
            if ( quote == null )
            {
                if ( c == '"' )
                {
                    quote = c;
                    sb.append ( c );
                }
                else if ( Character.isWhitespace ( c ) )
                {
                    // ignore
                }
                else if ( c == delimiter )
                {
                    result.add ( sb.toString () );
                    sb = new StringBuilder ();
                }
                else
                {
                    sb.append ( c );
                }
            }
            else
            {
                // quoted
                if ( c == quote )
                {
                    quote = null;
                }
                sb.append ( c );
            }

            pos++;
        }

        if ( sb.length () > 0 )
        {
            result.add ( sb.toString () );
        }

        return result.toArray ( new String[result.size ()] );
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy