Xmldoom/lib/Xmldoom/ORB/Definition.pm
package Xmldoom::ORB::Definition;
use Xmldoom::ORB::Definition::JSON;
use strict;
use Data::Dumper;
sub generate_object_hash
{
my $object = shift;
my $data = {
attributes => [ ],
key_names => [ ],
properties => [ ],
};
foreach my $column ( @{$object->get_table()->get_columns()} )
{
my $type = $object->get_table()->get_column_type( $column->{name} );
my $attr_data = {
name => $column->{name},
default => undef,
};
if ( $type->{type} eq 'string' or $type->{type} eq 'date' )
{
if ( defined $column->{default} )
{
$attr_data->{default} = $column->{default};
}
else
{
$attr_data->{default} = "";
}
}
elsif ( ($type->{type} eq 'integer' or $type->{type} eq 'float')
and defined $column->{default} )
{
$attr_data->{default} = $column->{default};
}
push @{$data->{attributes}}, $attr_data;
# add to the keys if necessary
if ( $column->{primary_key} )
{
push @{$data->{key_names}}, $column->{name};
}
}
foreach my $prop ( @{$object->get_properties()} )
{
if ( not $prop->isa('Xmldoom::Definition::Property::Simple') and
not $prop->isa('Xmldoom::Definition::Property::Object') )
{
# TODO: Then it is a 'custom' property which needs to be called
# into the ORB to get/set it.
next;
}
my $prop_data = {
name => $prop->get_name(),
get_names => $prop->get_autoload_get_list(),
set_names => $prop->get_autoload_set_list(),
};
if ( $prop->isa('Xmldoom::Definition::Property::Simple') )
{
$prop_data->{type} = 'simple';
$prop_data->{attribute} = $prop->get_attribute();
$prop_data->{trans_to} = $prop->get_trans_to();
$prop_data->{trans_from} = $prop->get_trans_from();
}
elsif ( $prop->isa('Xmldoom::Definition::Property::Object' ) )
{
$prop_data->{type} = 'object';
$prop_data->{object_name} = $prop->get_object_name();
$prop_data->{object_type} = $prop->get_type();
$prop_data->{connections} = [ ];
my $link = $prop->get_link();
# TODO: hock for inter-table, where (for now) we don't want to
# pass many-to-many links to Javascript.
if ( $link->get_relationship() ne 'many-to-many' )
{
foreach my $key ( @{$link->get_foreign_keys()} )
{
foreach my $ref ( @{$key->get_column_names()} )
{
push @{$prop_data->{connections}}, {
self => $ref->{local_column},
other => $ref->{foreign_column},
};
}
}
}
}
push @{$data->{properties}}, $prop_data;
}
return $data;
}
sub generate
{
my ($database, $type) = (shift, shift);
if ( not defined $type )
{
# TODO: this should default to XML, however, I haven't written that
# yet!
}
if ( $type eq 'json' )
{
return Xmldoom::ORB::Definition::JSON::generate($database);
}
else
{
die "Can't generate ORB definition for unknown type '$type'";
}
}
1;