|  | #!/usr/bin/perl | 
|  |  | 
|  | # | 
|  | # Licensed to the Apache Software Foundation (ASF) under one | 
|  | # or more contributor license agreements. See the NOTICE file | 
|  | # distributed with this work for additional information | 
|  | # regarding copyright ownership. The ASF licenses this file | 
|  | # to you under the Apache License, Version 2.0 (the | 
|  | # "License"); you may not use this file except in compliance | 
|  | # with the License. You may obtain a copy of the License at | 
|  | # | 
|  | #   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, | 
|  | # software distributed under the License is distributed on an | 
|  | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | # KIND, either express or implied. See the License for the | 
|  | # specific language governing permissions and limitations | 
|  | # under the License. | 
|  | # | 
|  |  | 
|  | use strict; | 
|  | use lib '../gen-perl'; | 
|  | use Thrift::Socket; | 
|  | use Thrift::Server; | 
|  | use tutorial::Calculator; | 
|  |  | 
|  | package CalculatorHandler; | 
|  | use base qw(tutorial::CalculatorIf); | 
|  |  | 
|  | sub new { | 
|  | my $classname = shift; | 
|  | my $self      = {}; | 
|  |  | 
|  | return bless($self,$classname); | 
|  | } | 
|  |  | 
|  |  | 
|  | sub ping | 
|  | { | 
|  | print "ping()\n"; | 
|  | } | 
|  |  | 
|  | sub add | 
|  | { | 
|  | my($self, $n1, $n2) = @_; | 
|  | printf("add(%d,%d)\n", $n1, $n2); | 
|  | return $n1 + $n2; | 
|  | } | 
|  |  | 
|  | sub calculate | 
|  | { | 
|  | my($self, $logid, $work) = @_; | 
|  | my $op   = $work->{op}; | 
|  | my $num1 = $work->{num1}; | 
|  | my $num2 = $work->{num2}; | 
|  | printf("calculate(%d, %d %d %d)\n", $logid, $num1, $num2, $op); | 
|  |  | 
|  | my $val; | 
|  |  | 
|  | if ($op == tutorial::Operation::ADD) { | 
|  | $val = $num1 + $num2; | 
|  | } elsif ($op == tutorial::Operation::SUBTRACT) { | 
|  | $val = $num1 - $num2; | 
|  | } elsif ($op == tutorial::Operation::MULTIPLY) { | 
|  | $val = $num1 * $num2; | 
|  | } elsif ($op == tutorial::Operation::DIVIDE) { | 
|  | if ($num2 == 0) | 
|  | { | 
|  | my $x = new tutorial::InvalidOperation; | 
|  | $x->what($op); | 
|  | $x->why('Cannot divide by 0'); | 
|  | die $x; | 
|  | } | 
|  | $val = $num1 / $num2; | 
|  | } else { | 
|  | my $x = new tutorial::InvalidOperation; | 
|  | $x->what($op); | 
|  | $x->why('Invalid operation'); | 
|  | die $x; | 
|  | } | 
|  |  | 
|  | my $log = new shared::SharedStruct; | 
|  | $log->key($logid); | 
|  | $log->value(int($val)); | 
|  | $self->{log}->{$logid} = $log; | 
|  |  | 
|  | return $val; | 
|  | } | 
|  |  | 
|  | sub getStruct | 
|  | { | 
|  | my($self, $key) = @_; | 
|  | printf("getStruct(%d)\n", $key); | 
|  | return $self->{log}->{$key}; | 
|  | } | 
|  |  | 
|  | sub zip | 
|  | { | 
|  | my($self) = @_; | 
|  | print "zip()\n"; | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | eval { | 
|  | my $handler       = new CalculatorHandler; | 
|  | my $processor     = new tutorial::CalculatorProcessor($handler); | 
|  | my $serversocket  = new Thrift::ServerSocket(9090); | 
|  | my $forkingserver = new Thrift::ForkingServer($processor, $serversocket); | 
|  | print "Starting the server...\n"; | 
|  | $forkingserver->serve(); | 
|  | print "done.\n"; | 
|  | }; if ($@) { | 
|  | if ($@ =~ m/TException/ and exists $@->{message}) { | 
|  | my $message = $@->{message}; | 
|  | my $code    = $@->{code}; | 
|  | my $out     = $code . ':' . $message; | 
|  | die $out; | 
|  | } else { | 
|  | die $@; | 
|  | } | 
|  | } | 
|  |  |