#!/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 $@; } }