#!/usr/bin/perl

use strict;
use utf8;
use LWP::UserAgent;
use XML::LibXML;
use Data::Dumper;
binmode STDOUT, ':utf8';

my $parser = new XML::LibXML;

#my $sourceEndpoint = 'http://openaire-services-beta.vls.icm.edu.pl:8280/is/services/datasourceManager';
my $sourceEndpoint = 'http://node6.t.openaire:8280/is/services/datasourceManager';
my $targetEndpoint = 'http://localhost:8280/app/services/dsManager';

foreach my $node (listDatasources($sourceEndpoint)) {
	eval {
		my $id = registerDatasource($targetEndpoint, $node);
		print "Datasource registered: $id\n";
	};
	print "Error: $@\n" if ($@);
}

sub listDatasources {
	my ($endpoint) = @_;

	my $req = 
		'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://services.dnetlib.eu/">' .
			'<SOAP-ENV:Header/>' .
			'<SOAP-ENV:Body>' .
				'<ns0:listAllDatasources/>' .
			'</SOAP-ENV:Body>' .
		'</SOAP-ENV:Envelope>';

	my $root = _invokeRemoteMethod_SOAP($endpoint, $req);

	return $root->findnodes('//*[local-name()="return"]');
}

sub registerDatasource {
	my ($endpoint, $node) = @_;
	
	my $reqBase = 
		'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://services.dnetlib.eu/">' .
			'<SOAP-ENV:Header/>' .
			'<SOAP-ENV:Body>' .
				'<ns0:addDatasource>' .
					'<ds></ds>' .
				'</ns0:addDatasource>' .
			'</SOAP-ENV:Body>' .
		'</SOAP-ENV:Envelope>';
		
	my $root = $parser->parse_string($reqBase)->getDocumentElement();
	my ($dsNode) = $root->findnodes('//*[local-name()="ds"]');
	foreach my $n ($node->childNodes()) {
		$dsNode->appendChild($n);
	}
	
	_invokeRemoteMethod_SOAP($endpoint, $root->toString(1));
	
	return $root->findvalue('//*[local-name()="ds"]/*[local-name()="id"]');
}

sub _invokeRemoteMethod_SOAP {
	my ($address, $message) = @_;
		
	my $ua = LWP::UserAgent->new;
	#	$ua->default_header('SOAPAction' => $method);
	$ua->timeout(600);
	$ua->env_proxy;
	my $response = $ua->post($address, 'Content' => $message, 'Content-Type' => 'text/xml; charset=utf-8');
	
	print 'ERROR: ' . $response->status_line . "\n" unless ($response->is_success);
	
	return $parser->parse_string($response->decoded_content)->getDocumentElement();
}


1;
