Hadoop-Inline-ClassLoader

 view release on metacpan or  search on metacpan

lib/Hadoop/Inline/ClassLoader.pm  view on Meta::CPAN

    # In short; CLASSPATH is not identical to PERL5LIB and this manual work is
    # needed. It is possible that we may hit some shell limitation on this
    # variable if too many things are pushed above.
    #
    @paths = map { glob $_ } @paths;

    if ( DEBUG ) {
        print STDERR 'CLASSPATH(after expansion):\n';
        print STDERR "\t$_\n" for @paths;
    }

    state $re_path_sep = RE_PATH_SEP_CHAR;
    my %n = do {
        my $native = _capture( $cmd => 'checknative' );
        my @n = split RE_MULTI_LF, $native;
        shift @n;
        map {
            my @k = split RE_WS, $_, 3; ## no critic (ValuesAndExpressions::ProhibitMagicNumbers)
            $k[0] =~ s{ $re_path_sep \z }{}xms;
            $k[0] => {
                status => $k[1],
                value  => $k[2],
            };
        } @n;
    };

    my $hadoop = $n{hadoop} || croak 'Failed to collect the hadoop native binary path';
    my $native = dirname $hadoop->{value};
    my $hopts = '-Djava.library.path=' . dirname $native;

    my %henv;
    $henv{CLASSPATH}                    = join CHAR_COLON, @paths;
    $henv{HADOOP_COMMON_LIB_NATIVE_DIR} = $native;
    $henv{HADOOP_OPTS}                  = $ENV{HADOOP_OPTS}
                                        ? $ENV{HADOOP_OPTS} . EMPTY_STRING . $hopts
                                        : $hopts
                                        ;

    # if LD_LIBRARY_PATH is not set:
    #
    # util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    for my $path (qw/
        JAVA_LIBRARY_PATH
        LD_LIBRARY_PATH
    /) {
        $henv{ $path } = $ENV{ $path } ? $ENV{ $path } . CHAR_COLON . $native : $native;
    }

    return \%henv, \@paths;
}

sub _map_java_imports_to_short_names {
    my $class = shift;
    # Give somewhat meaningful names to the imported Java classes

    state $package_delimiter = PACKAGE_DELIMITER;

    my $base_ns = 'org::apache::hadoop::';
    my $filter  = do {
        my @rv = split m{ $package_delimiter }xms, $base_ns;
        pop @rv;
        join PACKAGE_DELIMITER, @rv;
    };

    my @ns = $class->_namespace_probe( $base_ns );
    shift @ns;

    @ns = grep { m{ $package_delimiter \z }xms } @ns;

    no strict qw( refs );
    foreach my $class ( @ns ) {
        (my $short_name = $class) =~ s{
            \Q$filter\E
            $package_delimiter
        }{}xms;
        $short_name = join  PACKAGE_DELIMITER,
                            map { ucfirst $_ } split m{ $package_delimiter }xms,
                            $short_name
        ;
        # import() was called multiple times?
        next if %{ $short_name . PACKAGE_DELIMITER };

        printf STDERR 'Mapping %s => %s', $short_name, $class if DEBUG;

        *{ $short_name . PACKAGE_DELIMITER } = \*{ $class };
    }

    return;
}

sub _namespace_probe {
    my $class = shift;
    my $sym   = shift;

    my @names;
    no strict qw( refs );
    foreach my $type (
        grep {
            m{ \A [a-z] }xmsi
        }
        keys %{ $sym }
    ) {
        push @names, $class->_namespace_probe( $sym . $type );
    }

    return $sym, @names;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Hadoop::Inline::ClassLoader

=head1 VERSION

version 0.002

=head1 SYNOPSIS

    use Hadoop::Inline::ClassLoader qw( org.apache.hadoop.conf.Configuration );
    use Hadoop::Inline::ClassLoader \%options, @java_classes;

=head1 DESCRIPTION

Hadoop Java class loader through Inline::Java. This module tries to setup the
environment needed for the Hadoop classes and also has auto-study feature and
short name aliasing for Perl packages' name mappings.

=head1 NAME



( run in 1.346 second using v1.01-cache-2.11-cpan-71847e10f99 )