Confluence-Client-XMLRPC

 view release on metacpan or  search on metacpan

lib/Confluence/Client/XMLRPC.pm  view on Meta::CPAN

		return '';
	}

	$self->{token} = $result;

	_debugPrint( "Checking Confluence server version" ) if $CONFLDEBUG;
	my $serverInfo = _rpc( $self, 'getServerInfo' );
	if ( !defined($serverInfo) or ref($serverInfo) ne ref({}) ) {
		croak "Unable to determine Confluence version: aborting" if $RaiseError;
		warn  "Unable to determine Confluence version: aborting" if $PrintError;
		$self->{token} = '';
		return '';
	}
	$self->{'_serverInfo'} = $serverInfo;
	$self->{'_cflVersion'} = sprintf( "%03s%03s%03s", @{ $serverInfo }{ 'majorVersion', 'minorVersion', 'patchLevel' } );

	# set default API version based on Confluence version (unless explicitly given)
	unless ( defined($version) and $version =~ /\A(?:confluence)?([1-9])\Z/i ) {
		if ( $self->{'_cflVersion'} ge '004000000' ) {
			$API = 'confluence2';
		}
		else {
			$API = 'confluence1';
		}
	}
	return $self;
} ## end sub new

# login is an alias for new
sub login {
	return new @_;
}

sub getServerInfo {
	my Confluence::Client::XMLRPC $self = shift;
	if ($CONFLDEBUG) {
		_debugPrint("Retrieving serverInfo from local cache");
		_debugPrint( "Result=", $self->{'_serverInfo'} );
	}
	return $self->{'_serverInfo'};
}

sub getPageSummary {
	my Confluence::Client::XMLRPC $self = shift;

	if ( $self->{'_cflVersion'} ge "004000000" ) {
		return _rpc( $self, 'getPageSummary', @_ );
	}
	else {
		# Emulate method on older Confluence versions
		if ( my $page = _rpc( $self, 'getPage', @_ ) ) {
			my (%data) = map { $_ => $page->{$_} } grep { /\A(?:id|parentId|permissions|space|title|url|version)\Z/ } keys %{$page};
			return \%data;
		}
		else {
			return '';
		}
	}
}

sub updatePage {
	my Confluence::Client::XMLRPC $self = shift;
	my $page                            = shift;
	my $pageUpdateOptions               = ( shift || {} );

	if ( $self->{'_cflVersion'} ge "002010000" ) {
		_debugPrint("Using API method updatePage() for Confluence >= 2.10") if $CONFLDEBUG;
		return _rpc( $self, 'updatePage', $page, $pageUpdateOptions );
	}
	else {
		_debugPrint("Trying to emulate updatePage() for Confluence < 2.10") if $CONFLDEBUG;
		if ( my $existingPage = $self->getPage( $page->{'id'} ) ) {
			my %new = ();
			foreach my $key ( keys %{$existingPage} ) {
				$new{$key} = $existingPage->{$key};
			}
			foreach my $key ( keys %{$page} ) {
				$new{$key} = $page->{$key};
			}
			return _rpc( $self, 'storePage', \%new );
		}
	}
	return '';
}

sub updateOrStorePage {
	my Confluence::Client::XMLRPC $self = shift;
	my $newPage                         = shift;

	my $couldUpdate = 1;
	foreach my $field ( qw( id space title content version ) ) {
		$couldUpdate--, last unless exists $newPage->{$field};
	}

	# do we have all necessary data for calling the updatePage method?
	if ($couldUpdate) {
		return $self->updatePage( $newPage, @_ );
	}
	elsif ( exists( $newPage->{'id'} ) ) {

		# something is missing, but we might be able to get it from Confluence
		# check if page already exists
		my ( $raise, $print ) = ( setRaiseError(0), setPrintError(0) );
		my $oldPage = $self->getPageSummary( $newPage->{'id'} );
		setRaiseError($raise);
		setPrintError($print);
		if ( defined($oldPage) and ref($oldPage) eq ref({}) ) {
			foreach my $key ( keys %{$newPage} ) {
				$oldPage->{$key} = $newPage->{$key}
			}
			return $self->updatePage( $oldPage, @_ );
		}
	}
	elsif ( exists( $newPage->{'space'} ) and exists( $newPage->{'title'} ) ) {

		# can store new page with these two fields
		# check if page already exists
		my ( $raise, $print ) = ( setRaiseError(0), setPrintError(0) );
		my $oldPage = $self->getPageSummary( $newPage->{'space'}, $newPage->{'title'} );
		setRaiseError($raise);
		setPrintError($print);
		if ( defined($oldPage) and ref($oldPage) eq ref({}) ) {
			foreach my $key ( keys %{$newPage} ) {
				$oldPage->{$key} = $newPage->{$key}
			}
			return $self->updatePage( $oldPage, @_ );
		}
	}

	# might as well fail...
	return _rpc( $self, 'storePage', $newPage );
}

sub _rpc {
	my Confluence::Client::XMLRPC $self = shift;
	my $method = shift;
	croak "ERROR: Not connected" unless $self->{token};
	my @args = map { argcopy( $_, 0 ) } @_;
	_debugPrint( "Sending $API.$method ", @args ) if $CONFLDEBUG;
	my $result = $self->{client}->simple_request( "$API.$method", $self->{token}, @args );
	$LastError
		= defined($result)
		? (
		ref($result) eq 'HASH'
		? (
			exists $result->{faultString}



( run in 1.704 second using v1.01-cache-2.11-cpan-39bf76dae61 )