Advertisement
Guest User

Toby Inkster

a guest
Jul 16th, 2009
714
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.85 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. # Probably some pretty major insecurities here because of eval() code.
  4.  
  5. use RDF::Redland;
  6.  
  7. WoDo::FACTORY->create_from_json('Person', '
  8. {
  9.     "name" :
  10.     {
  11.         "return" : "first" ,
  12.         "sparql" : "SELECT ?name WHERE { <!> <http://xmlns.com/foaf/0.1/name> ?name . }"
  13.     } ,
  14.     "homepage" :
  15.     {
  16.         "return" : "array" ,
  17.         "sparql" : "SELECT ?homepage WHERE { <!> <http://xmlns.com/foaf/0.1/homepage> ?homepage . }"
  18.     }
  19. }');
  20.  
  21. my $storage = new RDF::Redland::Storage("hashes", "test", "new='yes',hash-type='memory'");
  22. my $model   = new RDF::Redland::Model($storage, "");
  23. my $parser  = new RDF::Redland::Parser("rdfxml");
  24. my $uri     = new RDF::Redland::URI('http://tobyinkster.co.uk/');
  25. $parser->parse_into_model($uri, $uri, $model);
  26.  
  27. my $toby = new WoDo::Person('http://tobyinkster.co.uk/#i', $model);
  28. print $toby->name . "\n";
  29.  
  30. package WoDo::FACTORY;
  31.  
  32. use JSON;
  33.  
  34. sub create_from_json
  35. {
  36.     my ($class, $target_class, $json) = @_;
  37.        
  38.     my $klass;
  39.     $klass .= sprintf("package WoDo::\%s;\n", $target_class);
  40.     $klass .= sprintf("\@ISA = qw(WoDo::BASE);\n");
  41.    
  42.     my $methods = from_json($json);
  43.     foreach my $method_name (keys %$methods)
  44.     {
  45.         my $sparql = $methods->{$method_name}->{'sparql'};
  46.         my $return = $methods->{$method_name}->{'return'} || 'objects';
  47.        
  48.         die "Undefined return type: \"return\".\n"
  49.             unless ($return =~ /^(first|array|objects)$/)
  50.             ;
  51.         die "Diallowed method name: \"$method_name\".\n"
  52.             if $method_name =~ /[^A-Za-z0-9_]/;
  53.         $sparql =~ s/\'/\\\'/g;
  54.        
  55.         $klass .= "sub $method_name { my (\$self) = \@_; return \$self->_sparql_$return(\'$sparql\'); }\n";
  56.     }
  57.    
  58.     $klass .= "1;\n";
  59.  
  60.     eval($klass);
  61.     die $@."\n" if $@;
  62. }
  63.  
  64. 1;
  65.  
  66. package WoDo::BASE;
  67.  
  68. use RDF::Redland;
  69.  
  70. sub new
  71. {
  72.     my ($class, $webid, $graph) = @_;
  73.     my $self = {};
  74.    
  75.     $self->{webid} = $webid;
  76.     $self->{graph} = $graph;
  77.    
  78.     bless $self, $class;
  79. }
  80.  
  81. sub _sparql_first
  82. {
  83.     my ($self, $querystring) = @_;
  84.  
  85.     $querystring =~ s/<!>/<$self->{webid}>/g;
  86.  
  87.     my $query = RDF::Redland::Query->new($querystring,
  88.         RDF::Redland::URI->new($self->{webid}),
  89.         undef,
  90.         'sparql');
  91.    
  92.     my $results = $self->{graph}->query_execute($query);
  93.     RESULT: while (! $results->finished)
  94.     {
  95.         my $node = $results->binding_value(0);
  96.         if ($node->type == $RDF::Redland::Node::Type_Resource)
  97.             { return $node->uri->as_string; }
  98.         elsif ($node->type == $RDF::Redland::Node::Type_Literal)
  99.             { return $node->literal_value; }
  100.        
  101.         $results->next_result;
  102.     }
  103.    
  104.     return undef;
  105. }
  106.  
  107. sub _sparql_array
  108. {
  109.     my ($self, $querystring) = @_;
  110.  
  111.     $querystring =~ s/<!>/<$self->{webid}>/g;
  112.  
  113.     my $query = RDF::Redland::Query->new($querystring,
  114.         RDF::Redland::URI->new($self->{webid}),
  115.         undef,
  116.         'sparql');
  117.    
  118.     my $rv = [];
  119.    
  120.     my $results = $self->{graph}->query_execute($query);
  121.     RESULT: while (! $results->finished)
  122.     {
  123.         my $node = $results->binding_value(0);
  124.         if ($node->type == $RDF::Redland::Node::Type_Resource)
  125.             { push @$rv, $node->uri->as_string; }
  126.         elsif ($node->type == $RDF::Redland::Node::Type_Literal)
  127.             { push @$rv, $node->literal_value; }
  128.        
  129.         $results->next_result;
  130.     }
  131.    
  132.     return $rv;
  133. }
  134.  
  135. sub _sparql_objects
  136. {
  137.     my ($self, $querystring) = @_;
  138.  
  139.     $querystring =~ s/<!>/<$self->{webid}>/g;
  140.  
  141.     my $query = RDF::Redland::Query->new($querystring,
  142.         RDF::Redland::URI->new($self->{webid}),
  143.         undef,
  144.         'sparql');
  145.    
  146.     my $rv = [];
  147.    
  148.     my $results = $self->{graph}->query_execute($query);
  149.     RESULT: while (! $results->finished)
  150.     {
  151.         my $row = {};
  152.         for (my $i=0; $i < $results->bindings_count(); $i++)
  153.         {
  154.             my $name = $results->binding_name($i);
  155.             my $node = $results->binding_value($i);
  156.            
  157.             if ($node->type == $RDF::Redland::Node::Type_Resource)
  158.                 { $row->{$name} = $node->uri->as_string; }
  159.             elsif ($node->type == $RDF::Redland::Node::Type_Literal)
  160.                 { $row->{$name} = $node->literal_value; }
  161.         }
  162.         push @$rv, $row;
  163.     }
  164.    
  165.     return $rv;
  166. }
  167.  
  168. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement