File Coverage

blib/lib/oEdtk/RecordParser.pm
Criterion Covered Total %
statement 12 81 14.8
branch 0 16 0.0
condition 0 12 0.0
subroutine 4 16 25.0
pod 0 12 0.0
total 16 137 11.6


line stmt bran cond sub pod time code
1             package oEdtk::RecordParser;
2            
3 1     1   567 use strict;
  1         3  
  1         32  
4 1     1   5 use warnings;
  1         2  
  1         21  
5 1     1   1104 use Data::Dumper;
  1         6730  
  1         88  
6 1     1   12 use Scalar::Util qw(blessed);
  1         2  
  1         1005  
7             our $VERSION = 0.7006;
8            
9             # METTRE AU POINT PARAMÉTRAGE
10             my $_denormalized_record = "OPTION";
11             # my $_denormalized_split_motif=;
12            
13            
14             sub dumper {
15 0     0 0   my $self = shift;
16            
17 0           return Dumper(shift);
18             }
19            
20            
21             sub new {
22 0     0 0   my ($class, $fh, %records) = @_;
23 0 0         defined($fh) or die "ERROR: not defined filhandle $fh : $!\n";
24 0           my %seek_keys;
25            
26             # foreach (values %records) {
27             # if (defined($_) && (!blessed($_) || !$_->isa('oEdtk::Record'))) {
28             # die "ERROR: oEdtk::RecordParser::new only accepts oEdtk::Record objects in the hash\n";
29             # }
30             # $seek_keys{$_->{'seek_key'}} .= $_->{'id_key'};
31             # $seek_keys{$_->{'seek_key'}} .= keys ($records->{$id});
32             # warn "INFO : seek_key = ". $_->{'seek_key'} ." = ".$seek_keys{$_->{'seek_key'}}."\n";
33             # }
34            
35 0           foreach my $key (keys %records) {
36 0           my $object = $records{$key};
37 0 0 0       if (defined($object) && (!blessed($object) || !$object->isa('oEdtk::Record')) ) {
    0 0        
38 0           die "ERROR: oEdtk::RecordParser::new only accepts oEdtk::Record objects in the hash\n";
39            
40             } elsif (defined($object)) { # ignore undef records
41             # warn "DEBUG: $key = ". $object->{'seek_key'} ." - isa('oEdtk::Record') ? ". $object->isa('oEdtk::Record') ." \n";
42             # $seek_keys{$object->{'seek_key'}} .= $object->{'id_key'};
43 0           $seek_keys{$object->{'seek_key'}} .= $key;
44             # INFO : seek_key = LIGNE.{153}(.{10}) = L5L6T3L7L4C1T6T4T7F5L3T5
45             # warn "INFO : seek_key = ". $object->{'seek_key'} ." = ".$seek_keys{$object->{'seek_key'}}."\n";
46             }
47             }
48            
49            
50 0           my $self = {
51             input => $fh,
52             records => \%records,
53             seek_keys => \%seek_keys,
54             line => '',
55             skip_line => 'FLUX',
56             mute_record => 'ENTETE',
57             mute_id => 'ENT',
58             line_record => 'LIGNE',
59             key_offset => 153,
60             key_size => 10,
61             denormalized => 'OPTION',
62             denormalized_split_motif => "\x{0}|\x{1}|\x{2}"
63             };
64            
65 0           bless $self, $class;
66 0           return $self;
67             }
68            
69            
70             sub set_skip_line {
71 0     0 0   my ($self, $value)= @_;
72            
73 0           $self->{'skip_line'} .= $value;
74             }
75            
76             sub set_mute_record {
77 0     0 0   my ($self, $value)= @_;
78            
79 0           $self->{'mute_record'} .= $value;
80             }
81            
82             sub set_mute_id {
83 0     0 0   my ($self, $value)= @_;
84            
85 0           $self->{'mute_id'} .= $value;
86             }
87            
88             sub set_line_record {
89 0     0 0   my ($self, $value)= @_;
90            
91 0           $self->{'line_record'} .= $value;
92             }
93            
94             sub set_key_offset {
95 0     0 0   my ($self, $value)= @_;
96            
97 0           $self->{'key_offset'} .= $value;
98             }
99            
100             sub set_key_size {
101 0     0 0   my ($self, $value)= @_;
102            
103 0           $self->{'key_size'} .= $value;
104             }
105            
106             sub set_denormalized_record {
107 0     0 0   my ($self, $value)= @_;
108            
109 0           $self->{'denormalized'} .= $value;
110             }
111            
112             sub add_motif_to_denormalized_split {
113 0     0 0   my ($self, $motif)= @_;
114            
115 0           $self->{'denormalized_split_motif'} .= "|".$motif;
116             }
117            
118             sub set_motif_to_denormalized_split {
119 0     0 0   my ($self, $motif)= @_;
120            
121 0           $self->{'denormalized_split_motif'} = $motif;
122             }
123            
124            
125             # Parse and return the next record in the stream.
126             sub next {
127 0     0 0   my ($self) = @_;
128            
129 0           my $denormalized_split_motif = $self->{'denormalized_split_motif'};
130 0           my $denormalized = $self->{'denormalized'};
131 0           my $records = $self->{'records'};
132 0           my $seek_keys = $self->{'seek_keys'};
133 0           my $skip_line = $self->{'skip_line'};
134 0           my $mute_record = $self->{'mute_record'};
135 0           my $line_record = $self->{'line_record'};
136 0           my $key_offset = $self->{'key_offset'};
137 0           my $key_size = $self->{'key_size'};
138 0           my $fh = $self->{'input'};
139 0 0         defined($fh) or die "ERROR: not defined filhandle $fh : $!\n";
140            
141            
142 0           my ($id, $data) = ("","");
143 0   0       do {
144 0           my $line = <$fh>;
145            
146             # Skip lines starting with FLUX.
147 0   0       while (defined($line) && $line =~ /^$skip_line/) {
148 0           $line = <$fh>;
149             }
150 0 0         return () unless defined $line;
151            
152 0           chomp $line;
153 0           $self->{'line'} = $line;
154            
155             SEEK: {
156 0 0         if ($line =~ /^$denormalized(.*)$/) {
  0            
157 0           $data= $1;
158 0           $id = $denormalized;
159            
160             } else {
161 0           foreach my $search_key (sort keys %{$seek_keys}) {
  0            
162             # warn "DEBUG: seek => $search_key line $.\n";
163 0 0         if ($line =~ /^$search_key(.*)$/){
164 0           ($id, $data) = ($1, $2);
165 0           $id =~s/\s*//g;
166             # if (exists $records->{$key}){
167             # ($id, $data) = ($key, $right);
168             # warn "DEBUG: success search_key = $search_key, for keys $id line $.\n";
169 0           last SEEK;
170             # } else {
171            
172             }
173             }
174             # warn "DEBUG: search_key = $search_key, for keys : ". $seek_keys->{$search_key} ."\n";
175             }
176 0           warn "INFO : UNKNOWN RECORD (line $.)=>$line\n";
177 0           warn "INFO : IGNORING UNKNOWN RECORD (line $.)\n";
178             # if ($line =~ /^$mute_record.(.*)/) {
179             # ($id, $data) = ($self->{'mute_id'}, " ".$1);
180             #
181             # } elsif ($line =~ /^$line_record.{$key_offset}(.{$key_size})(.*)$/) { # xxxxx evoluer ici pour prendre les clefs de record sur 2 car / 4 car voir plus + revoir longueur paramétrable des entêtes et des clefs
182             # # on fixe l'identifiant du record et on passe le record, clef comprise :
183             # # le fields_offset est géré dans l'objet record
184             # $data = $1.$2;
185             # $id = $1;
186             # $id =~s/\s*//g;
187             # if (!exists $records->{$id}) {
188             # die "ERROR: Unexpected record identifier: $id\n";
189             # }
190             #
191             # } else {
192             # die "ERROR: Unexpected line format (line $.): $line\n";
193             # }
194             # }
195             }
196             } while ($id ne $denormalized && !defined($records->{$id}));
197             # DENORMALIZED RECORD SHOULD BE AT THE END OF DATA STREAM
198             # A REVOIR
199            
200 0 0         if ($id eq $denormalized) {
201             # my @data = split(/(?:$denormalized_split_motif)+/, $data);
202 0           my @data = split(/(?:$denormalized_split_motif)/, $data);
203             # my @data = split(/(?:\x{0}|\x{1}|\x{2})+/, $data);
204             # my @data = split(/(?:\x{0}|\x{1}|\x{2}|\x{20})+/, $data);
205             # my @data = split(/(?:\(?:\x{0}|\x{20})+(?:\x{1}|\x{2})+/, $data);
206             # my @data = split($_denormalized_split_motif, $data);
207 0           return ($id, \@data);
208             }
209            
210 0           my $rec = $records->{$id};
211 0           my %vals= $rec->parse($data);
212 0           return ($id, \%vals);
213             }
214            
215             1;