#!/usr/bin/perl -w ################################################################################ # Location: ............. eBay/API/XML/Tools/CodeGen/XSD # File: ................. genEBayApiData.pl # Original Author: ...... Milenko Milanovic # Last Modified By: ..... Jeff Nokes # Last Modified: ........ 03/30/2007 @ 23:09 # # Description: # This is a script used to auto-generate the call and datatype classes for # the eBay Perl SDK. It is user interactive; to see usage, just execute the # script with no arguments. Also, referecne README for more information. ################################################################################ =pod =head1 genEBayApiData.pl This is a script used to auto-generate the call and datatype classes for the eBay Perl SDK. It is user interactive; to see usage, just execute the script with no arguments. Also, referecne README for more information. =cut # Required Includes # ------------------------------------------------------------------------------ use lib '../../../../../../'; # To get access to all packages in XSD directory use strict; use warnings; use Getopt::Long; use Cwd; use LWP::UserAgent; use XML::Simple ":strict"; use IO::File; use File::Spec; use Data::Dumper; use eBay::API::XML::Tools::CodeGen::XSD::BaseCodeGenDataType; use eBay::API::XML::Tools::CodeGen::XSD::CodeGenReleaseClass; use eBay::API::XML::Tools::CodeGen::XSD::CodeGenBaseCallGenClass; use eBay::API::XML::Tools::CodeGen::XSD::CodeGenRequestResponseType; use eBay::API::XML::Tools::CodeGen::XSD::CodeGenNonCallRequestResponseType; # examples: NotificationMessageType use eBay::API::XML::Tools::CodeGen::XSD::CodeGenComplexDataType; # examples: ItemType use eBay::API::XML::Tools::CodeGen::XSD::CodeGenComplexSimpleDataType; # examples: AmountType use eBay::API::XML::Tools::CodeGen::XSD::CodeGenSimpleDataType; # examples: ItemIDType, UserIdType use eBay::API::XML::Tools::CodeGen::XSD::CodeGenEnumDataType; # examples: AckDataType use eBay::API::XML::Tools::CodeGen::XSD::CodeGenApiCall; # Variable Declarations # ------------------------------------------------------------------------------ # Constants # none # Globals # none # Script Lexicals my $gsRootPackageName = "eBay::API::XML"; my $ghRootOutputDir = undef; my @gaClasses = (); # element = class instance my %ghCallNames = (); # key = 'api call name', value = undef my $gsStepNdx = 1; # used for logStep; # Main Script # ------------------------------------------------------------------------------ main(); =head2 usage() =cut sub usage { my $filename = shift; my $url = shift; if ( length($filename) == 0 && length($url) == 0 ) { my $scriptName = $0; # script name # $scriptName = "./genEBayApiDataTypes.pl" # remove everything except the script name. if ( $scriptName =~ /\// ) { my @arr = split(/\//, $scriptName); $scriptName = $arr[-1]; } my $msg = <<"USAGE"; usage: $scriptName --file=s --url=s --outputDir=s arguments: file - Read eBay API xsd schema from a specified path/file. url - Read eBay API xsd schema from a specified URL. The retrieved content is saved into a file into the current directory. The file is named after the URL's document name. outputDir - Root output directory for generated classes. If 'outputDir' is not specified then this script will look for the first existence of the path 'eBay/API/XML' up from the current directory. If there is more than one instance of 'eBay/API/XML' found, then it will attempt to use the deepest one. If 'eBay/API/XML' path DOES NOT exist, generated classes are stored in the current directory. If a path is specified and it does not currently exist, it will be created for you. If a path is specified and it does exist, the auto-generated code will be placed under that path. notes: * Either 'file' or 'url' argument must be set. 'file' option takes precedence over 'url' option. USAGE print $msg; exit; } } =head2 main() =cut # Subroutine Definitions # ------------------------------------------------------------------------------ sub main { my $filename = ''; # my $url = ''; # my $outputDir = undef; # default value, output to current working dir GetOptions ( 'file=s' => \$filename ,'url=s' => \$url ,'outputDir=s' => \$outputDir ); usage ( $filename, $url); eBay::API::XML::Tools::CodeGen::XSD::BaseCodeGenDataType::setRootPackageName( $gsRootPackageName ); $ghRootOutputDir = determineOutputDir( $outputDir ); logStep ("", 0); # just add yet another empty row logStep ("S T A R T \n", 0); my $rsXmlString; my $inputDocName = ''; if ( defined $filename && length($filename) > 0 ) { $inputDocName = $filename; $rsXmlString = readWsdlFromFile($filename); } else { logStep ("F E T C H I N G input document from\n\t$url"); $inputDocName = $url; $rsXmlString = readWsdlFromUrl($url); my @arr = split(/\//, $url); my $fileName = $arr[-1]; writeStringToFile ( $fileName, $$rsXmlString); logStep ("F E T C H I N G - DONE, DATA saved to $fileName!"); } logStep ("P A R S I N G input document"); my $rhXmlSimple = getRhXmlSimple( $rsXmlString ); #print Dumper($rhXmlSimple); my $inputDocType = getInputDocumentType($inputDocName); my $rhTypes; my $sReleaseNumber = ''; if ( $inputDocType eq 'wsdl' ) { ### /wsdl:definitions/wsdl:types/xs:schema $rhTypes = $rhXmlSimple->{'wsdl:types'}->{'xs:schema'}; $sReleaseNumber = _getReleaseNumber( 'rhXmlSimple' => $rhXmlSimple ); } else { ### /xs:schema/xs:complexType $rhTypes = $rhXmlSimple; $sReleaseNumber = _getReleaseNumber( 'rsXmlString' => $rsXmlString ); } my $sReleaseType = _getReleaseType( $inputDocName ); eBay::API::XML::Tools::CodeGen::XSD::BaseCodeGenDataType::setReleaseNumber( $sReleaseNumber ); eBay::API::XML::Tools::CodeGen::XSD::BaseCodeGenDataType::setReleaseType( $sReleaseType ); generateReleaseClass ( $sReleaseNumber, $sReleaseType); processTypes($rhTypes); generateBaseCallGenClass (); } sub _getReleaseType { my $inputDocName = shift; my $sReleaseType; if ( $inputDocName =~ m/private/ ) { $sReleaseType = 'private'; } else { $sReleaseType = 'public'; } return $sReleaseType; } sub _getReleaseNumber { my %args = @_; my $rhXmlSimple = $args{'rhXmlSimple'}; my $rsXmlString = $args{'rsXmlString'}; my $sReleaseNumber = ''; if ( defined $rhXmlSimple ) { # WSDL based generation ### /wsdl:definitions/wsdl:service/wsdl:documentation $sReleaseNumber = $rhXmlSimple->{'wsdl:service'}->{'wsdl:documentation'}; } elsif ( defined $rsXmlString ) { # XSD based code generation # In XSD file, version is kept in comments at the top of # the document: # # # # # So take first 1000 chars (just play it safe) and # extract the version number. my $str = $$rsXmlString; $sReleaseNumber = substr ( $str, 0, 200); $sReleaseNumber =~ s/^.*\