Lemonldap-NG-Manager
view release on metacpan or search on metacpan
lib/Lemonldap/NG/Manager/Conf/Parser.pm view on Meta::CPAN
ref $self->newConf->{applicationList}
? $self->newConf->{applicationList}
: {}
}
);
@listCatRef = map { $_ ? $_ : () } @listCatRef;
@listCatNew = map { $_ ? $_ : () } @listCatNew;
@listCatRef = sort @listCatRef;
@listCatNew = sort @listCatNew;
hdebug( '# @listCatRef : ', \@listCatRef );
hdebug( '# @listCatNew : ', \@listCatNew );
# Check for deleted
my @diff =
grep !${ { map { $_, 1 } @listCatNew } }{$_}, @listCatRef;
if ( scalar @diff ) {
$self->confChanged(1);
push @{ $self->changes },
{
new => join( ', ', 'categoryList', @listCatNew ),
key => join( ', ', 'Deletes in cat(s)', @diff ),
old => join( ', ', 'categoryList', @listCatRef ),
};
}
}
next;
}
# Application list sub nodes
elsif ( $leaf->{id} =~ /^applicationList\/(.+)$/ ) {
hdebug('Application list subnode');
use feature 'state';
my @cats = split /\//, $1;
my $app = pop @cats;
$self->newConf->{applicationList} //= {};
# $cn is a pointer to the parent
my $cn = $self->newConf->{applicationList};
my $cmp = $self->refConf->{applicationList};
my @path;
# Makes $cn point to the parent
foreach my $cat (@cats) {
hdebug(" looking to cat $cat");
unless ( defined $knownCat->{$cat} ) {
push @{ $self->{errors} },
{ message =>
"Fatal: sub cat/app before parent ($leaf->{id})" };
return 0;
}
$cn = $cn->{ $knownCat->{$cat} };
push @path, $cn->{catname};
$cmp->{$cat} //= {};
$cmp = $cmp->{$cat};
}
my $newapp = $app;
# Compute a nice name for new nodes, taking care of potential conflicts
# For some reason, the manager sends /nNaN sometimes
if ( $newapp =~ /^n(\d+|NaN)$/ ) {
# Remove all special characters
my $baseName = $leaf->{title} =~ s/\W//gr;
$baseName = lc $baseName;
$newapp = $baseName;
my $cnt = 1;
while ( exists $cn->{$newapp} ) {
$newapp = "${baseName}_" . $cnt++;
}
}
# Create new category
#
# Note that this works because nodes are ordered so "cat/cat2/app"
# is looked after "cat" and "cat/cat2"
if ( $leaf->{type} eq 'menuCat' ) {
hdebug(' menu cat');
$knownCat->{__id}++;
$knownCat->{$app} = $newapp;
$cn->{$newapp} = {
catname => $leaf->{title},
type => 'category',
order => $knownCat->{__id}
};
unless ($cmp->{$app}
and $cmp->{$app}->{catname} eq $cn->{$newapp}->{catname} )
{
$self->confChanged(1);
push @{ $self->changes },
{
key => join(
', ', 'applicationList', @path, $leaf->{title}
),
new => $cn->{$newapp}->{catname},
old => (
$cn->{$newapp} ? $cn->{$newapp}->{catname} : undef
)
};
}
if ( ref $subNodes ) {
$self->_scanNodes($subNodes) or return 0;
}
my @listCatRef = keys %{ $cmp->{$app} };
my @listCatNew = keys %{ $cn->{$newapp} };
# Check for deleted
unless ( @listCatRef == @listCatNew ) {
$self->confChanged(1);
push @{ $self->changes },
{
key => join( ', ', 'applicationList', @path ),
new => 'Changes in cat(s)/app(s)',
};
}
}
# Create new apps
if ( $leaf->{type} eq 'menuApp' ) {
hdebug(' new app');
$knownCat->{__id}++;
( run in 1.146 second using v1.01-cache-2.11-cpan-ceb78f64989 )