Pastebin launched a little side project called HostCabi.net, check it out ;-)Don't like ads? PRO users don't see any ads ;-)
Guest

Toby Inkster

By: a guest on Jul 16th, 2009  |  syntax: Perl  |  size: 3.85 KB  |  hits: 514  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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;