1#! /usr/bin/env perl
2
3use strict;
4
5use File::Spec;
6
7my $xgettext;
8
9my $code;
10
11BEGIN {
12    my @spec = File::Spec->splitpath(__FILE__);
13    $spec[2] = 'JavaXGettext.java';
14    my $java_filename = File::Spec->catpath(@spec);
15    open HANDLE, "<$java_filename"
16        or die "Cannot open '$java_filename': $!\n";
17    $code = join '', <HANDLE>;
18}
19
20use Inline Java => $code;
21
22Locale::XGettext::Language::Java->newFromArgv(\@ARGV)->run->output;
23
24package Locale::XGettext::Language::Java;
25
26use strict;
27
28use base 'Locale::XGettext';
29
30sub newFromArgv {
31    my ($class, @args) = @_;
32
33    my $self = $xgettext = {};
34    bless $self, $class;
35
36    $self->{__helper} = JavaXGettext->new;
37
38    $self->SUPER::newFromArgv(@args);
39
40    return $self;
41}
42
43sub readFile {
44    my ($self, $filename) = @_;
45
46    $self->{__helper}->readFile($filename);
47}
48
49# See the comments in JavaXGettext.java for more information about the
50# following optional methods.
51sub extractFromNonFiles {
52    my ($self) = @_;
53
54    return $self->SUPER::extractFromNonFiles()
55        if !$self->can('extractFromNonFiles');
56
57    return $self->{__helper}->extractFromNonFiles;
58}
59
60# We have to translate that from Java.
61sub defaultKeywords {
62    my ($self) = @_;
63
64    return $self->SUPER::defaultKeywords()
65        if !$self->{__helper}->can('defaultKeywords');
66
67    return $self->{__helper}->defaultKeywords;
68
69    # Turn the array of arrays returned by the Java class method into a Perl
70    # Hash.  The array returned from Java is an Inline::Java::Array which
71    # does not support splice().  We therefore have to copy it into a
72    # plain array.
73    my %keywords = map {
74        my @keyword = @{$_};
75        $keyword[0] => [splice @keyword, 1]
76    } @{$self->{__helper}->defaultKeywords};
77
78    return \%keywords;
79}
80
81sub languageSpecificOptions {
82    my ($self) = @_;
83
84    return $self->SUPER::extractFromNonFiles()
85        if !$self->{__helper}->can('languageSpecificOptions');
86
87    return $self->{__helper}->languageSpecificOptions;
88}
89
90sub fileInformation {
91    my ($self) = @_;
92
93    return $self->SUPER::fileInformation()
94        if !$self->{__helper}->can('fileInformation');
95
96    return $self->{__helper}->fileInformation;
97}
98
99sub canExtractAll {
100    my ($self) = @_;
101
102    return $self->SUPER::canExtractAll()
103        if !$self->{__helper}->can('canExtractAll');
104
105    return $self->{__helper}->canExtractAll;
106}
107
108sub canKeywords {
109    my ($self) = @_;
110
111    return $self->SUPER::canKeywords()
112        if !$self->{__helper}->can('canKeywords');
113
114    return $self->{__helper}->canKeywords;
115}
116
117sub canFlags {
118    my ($self) = @_;
119
120    return $self->SUPER::canFlags()
121        if !$self->{__helper}->can('canFlags');
122
123    return $self->{__helper}->canFlags;
124}
125
126# This will not win a prize for clean software design.  You cannot invoke
127# methods of Perl object from Java.  We therefore keep the most "current"
128# instance of the extractor class in a variable $xgettext and call
129# the methods on this instance.  This works without problems inside of a
130# script which is sufficient for our needs.
131
132package Locale::XGettext::Callbacks;
133
134use strict;
135
136use Scalar::Util qw(reftype);
137
138sub __unbless($);
139
140sub addEntry {
141    my ($class, %entry) = @_;
142
143    $xgettext->addEntry(\%entry);
144
145    return 1;
146}
147
148sub option {
149    my ($class, $name) = @_;
150
151    return $xgettext->option($name);
152}
153
154sub keywords {
155    my ($class) = @_;
156
157    my $keywords = JavaXGettextKeywords->new;
158    my $value = $xgettext->keywords;
159
160    foreach my $key (keys %$value) {
161        my $perldef = $value->{$key};
162        my $javadef = JavaXGettextKeyword->new(
163            $perldef->function,
164            $perldef->singular, $perldef->plural,
165            $perldef->context, $perldef->comment
166        );
167
168        $keywords->put($key, $javadef);
169    }
170
171    return $keywords;
172}