Project

General

Profile

« Previous | Next » 

Revision 9780

Added by Chris Jones over 8 years ago

Merge changes from the 2.6.0 release.

View differences:

register-dataset.cgi
109 109
my $userManagementUrl = $properties->getProperty('auth.userManagementUrl');
110 110

  
111 111
my $now = time;
112
# The party param index of the first creator role encountered
113
my $firstCreatorIndex = -1;
114
# Was a contact submitted in the form?
115
my $hasContact = 0;
116
# Was a metadataProvider submitted in the form?
117
my $hasMetadataProvider = 0;
112 118

  
119

  
113 120
# Import all of the HTML form fields as variables
114 121
import_names('FORM');
115 122

  
......
549 556
                deleteRemovedData();
550 557
            }
551 558

  
552
		}
553
		else {
559
		} else {
554 560
			debug("The form has an existing docid: " . $FORM::docid);
555 561

  
556 562
			# document is being modified
......
865 871

  
866 872
	push( @invalidParams, "Name of the Project is not selected in the form." )
867 873
	  if ( scalar(@FORM::wg) == 0 && $required->{'wgList'} eq 'true' );
868
	push( @invalidParams, "First name of person entering the form is missing." )
869
	  unless hasContent($FORM::providerGivenName);
870
	push( @invalidParams, "Last name of person entering the form is missing." )
871
	  unless hasContent($FORM::providerSurName);
872
	push( @invalidParams, "Dataset title is missing." )
874
	
875
	push( @invalidParams, "Please provide a dataset title." )
873 876
	  unless hasContent($FORM::title);
877
	
874 878
	if ( $show->{'siteList'} eq 'true' ) {
875 879
		push( @invalidParams, ucfirst( $config->{'site'} ) . " name is missing." )
876 880
		  unless ( ( hasContent($FORM::site) && !( $FORM::site =~ /^Select/ ) )
877 881
			|| $skinName eq "nceas" );
878 882
	}
879
	push( @invalidParams, "First name of principal data set owner is missing." )
880
	  unless hasContent($FORM::origNamefirst0);
881
	push( @invalidParams, "Last name of principal data set owner is missing." )
882
	  unless hasContent($FORM::origNamelast0);
883
	push( @invalidParams, "Dataset abstract is missing." )
883
    
884
    if ( $required->{'funding'} eq 'true' ) {
885
    	push( @invalidParams, "Please provide an award number." )
886
    	  unless hasContent($FORM::funding);
887
        
888
    }
889

  
890
	push( @invalidParams, "Please provide a person's first name, last name, and role, or an organization name and it's role.")
891
	  unless ((hasContent($FORM::partyFirstName) && 
892
		         hasContent($FORM::partyLastName) &&
893
						 hasContent($FORM::partyRole)) 
894
						 ||
895
		         (hasContent($FORM::partyOrgName) && 
896
						  hasContent($FORM::partyRole)));
897
	
898
    my @partyRoles = param('partyRole');
899
    my $hasCreator = 0;
900
    foreach  my $partyRole (@partyRoles) {
901
        if ( $partyRole eq 'creator' ) {
902
            $hasCreator = 1;
903
            last;
904
            
905
        }
906
    }
907
	push( @invalidParams, "Please provide a party entry with a 'Creator' role." )
908
	  unless $hasCreator == 1;
909
    
910
	push( @invalidParams, "Please provide a dataset abstract." )
884 911
	  unless hasContent($FORM::abstract);
885 912

  
886 913
	if ( $modules->{'temporal'} eq 'true' ) {
887
		push( @invalidParams, "Year of start date is missing." )
914
		push( @invalidParams, "Please provide a start date year." )
888 915
		  unless ( hasContent($FORM::beginningYear)
889 916
			|| $required->{'temporal'} ne 'true' );
890
		push( @invalidParams,
891
"Year of stop date has been specified but year of start date is missing."
917
		
918
		push( @invalidParams, "Year of stop date has been specified but year of start date is missing."
892 919
		  )
893 920
		  if ( ( !hasContent($FORM::beginningYear) )
894 921
			&& hasContent($FORM::endingYear) );
895 922
	}
896
	push( @invalidParams, "Geographic description is missing." )
897
	  unless ( hasContent($FORM::geogdesc)
898
		|| $required->{'spatial'} ne 'true' );
923
	
924
	push( @invalidParams, "Please provide a geographic description." )
925
	  unless ( hasContent($FORM::geogdesc) || $required->{'spatial'} ne 'true' );
899 926

  
900 927
	if ( $FORM::beginningMonth eq "MM" ) {
901 928
		$FORM::beginningMonth = "";
......
911 938
	}
912 939

  
913 940
	if ( hasContent($FORM::beginningYear)
914
		&& !( $FORM::beginningYear =~ /[0-9]{4}/ ) )
915
	{
916
		push( @invalidParams, "Invalid year of start date specified." );
941
		&& !( $FORM::beginningYear =~ /[0-9]{4}/ ) ) {
942
		push( @invalidParams, "Please provide a four digit start date." );
917 943
	}
918 944

  
919
	if ( hasContent($FORM::endingYear) && !( $FORM::endingYear =~ /[0-9]{4}/ ) )
920
	{
921
		push( @invalidParams, "Invalid year of stop date specified." );
945
	if ( hasContent($FORM::endingYear) && !( $FORM::endingYear =~ /[0-9]{4}/ ) ) {
946
		push( @invalidParams, "Please provide a four digit stop date." );
922 947
	}
923 948

  
924 949
	# If the "use site" coord. box is checked and if the site is in
......
1012 1037

  
1013 1038
	if ( $modules->{'spatial'} eq 'true' && $required->{'spatial'} eq 'true' ) {
1014 1039
		if ($FORM::useSiteCoord) {
1015
			push( @invalidParams,
1016
"The Data Registry doesn't have latitude and longitude information for the site that you chose. Please go back and enter the spatial information."
1040
			push( @invalidParams, "The Data Registry doesn't have latitude and longitude information for the site that you chose. Please go back and enter the spatial information."
1017 1041
			) unless ( hasContent($latDeg1) && hasContent($longDeg1) );
1018 1042
		}
1019 1043
		else {
......
1024 1048
			  unless ( hasContent($longDeg1)
1025 1049
				|| $required->{'spatial'} ne 'true' );
1026 1050
		}
1027
		push( @invalidParams,
1028
"You must provide a geographic description if you provide latitude and longitude information."
1051
		push( @invalidParams, "You must provide a geographic description if you provide latitude and longitude information."
1029 1052
		  )
1030 1053
		  if ( ( hasContent($latDeg1) || ( hasContent($longDeg1) ) )
1031 1054
			&& ( !hasContent($FORM::geogdesc) ) );
1032 1055
	}
1033 1056

  
1034 1057
	if ( $modules->{'method'} eq 'true' ) {
1035
		push( @invalidParams,
1036
"You must provide a method description if you provide a method title."
1058
		push( @invalidParams, "You must provide a method description if you provide a method title."
1037 1059
		  )
1038 1060
		  if (
1039 1061
			hasContent($FORM::methodTitle)
1040 1062
			&& (  !( scalar(@FORM::methodPara) > 0 )
1041 1063
				|| ( !hasContent( $FORM::methodPara[0] ) ) )
1042 1064
		  );
1043
		push( @invalidParams,
1044
"You must provide a method description if you provide an extent of study description."
1065
		push( @invalidParams, "You must provide a method description if you provide an extent of study description."
1045 1066
		  )
1046 1067
		  if (
1047 1068
			hasContent($FORM::studyExtentDescription)
1048 1069
			&& (  !( scalar(@FORM::methodPara) > 0 )
1049 1070
				|| ( !hasContent( $FORM::methodPara[0] ) ) )
1050 1071
		  );
1051
		push( @invalidParams,
1052
"You must provide both an extent of study description and a sampling description, or neither."
1072
		push( @invalidParams, "You must provide both an extent of study description and a sampling description, or neither."
1053 1073
		  )
1054 1074
		  if (
1055 1075
			(
......
1075 1095
		}
1076 1096
	}
1077 1097

  
1078
	push( @invalidParams, "First name of data set contact is missing." )
1079
	  unless ( hasContent($FORM::origNamefirstContact)
1080
		|| $FORM::useOrigAddress );
1081
	push( @invalidParams, "Last name of data set contact is missing." )
1082
	  unless ( hasContent($FORM::origNamelastContact)
1083
		|| $FORM::useOrigAddress );
1084
	if ( $required->{'contactEmailAddress'} eq 'true' ) {
1085
		if ($FORM::useOrigAddress) {
1086
			push( @invalidParams,
1087
"Email address of data set owner is missing. This is required as it will be used as contact email address as specified by you."
1088
			) unless ( hasContent($FORM::origEmail) );
1089
		}
1090
		else {
1091
			push( @invalidParams,
1092
				"Email address of data set contact is missing." )
1093
			  unless ( hasContent($FORM::origEmailContact) );
1094
		}
1095
	}
1096

  
1097
	# check required distribution elements
1098
	push( @invalidParams, "Data medium is required." )
1099
	  unless ( hasContent($FORM::dataMedium) );
1100
	if ( $FORM::dataMedium eq 'other' ) {
1101
		push( @invalidParams,
1102
			"Must enter custom data medium when 'other' is selected." )
1103
		  unless ( hasContent($FORM::dataMediumOther) );
1104
	}
1105
	push( @invalidParams, "Usage rights are required." )
1098
	push( @invalidParams, "Please provide the data medium." )
1099
	  unless ( hasContent($FORM::dataMedium));
1100
	
1101
	push( @invalidParams, "Please provide usage rights." )
1106 1102
	  unless ( hasContent($FORM::useConstraints) );
1107 1103
	if ( $FORM::useConstraints eq 'other' ) {
1108 1104
		push( @invalidParams,
......
1236 1232
#
1237 1233
################################################################################
1238 1234
sub allFileData {
1235
	if ( $debug_enabled ) {
1236
	    debug("allFileData() called. ");
1237
		
1238
	}
1239

  
1239 1240
	my %uploadedFiles = ();
1240 1241
	my $fileInfo;
1241 1242
	my $docid;
......
1246 1247

  
1247 1248
			# ignore data which is scheduled for deletion
1248 1249
			if ( grep { $_ eq ("uploadname_$fileNum") } @FORM::deletefile ) {
1249
				debug(
1250
"Not generating metadata for file scheduled for deletion: $fn"
1251
				);
1252
			}
1253
			else {
1250
				debug("Not generating metadata for file scheduled for deletion: $fn");
1251
			
1252
			} else {
1254 1253
				debug("Retrieving metadata for file: $fn");
1255 1254
				( $docid, $fileInfo ) = fileMetadata($fileNum);
1256 1255
				$uploadedFiles{$docid} = $fileInfo;
......
1261 1260
	return %uploadedFiles;
1262 1261
}
1263 1262

  
1263
# Returns minimal metadata about an uploaded file: hash, name, content-type, permissions
1264 1264
sub fileMetadata {
1265
	if ( $debug_enabled ) {
1266
		debug("fileMetadata() called.");
1267
		
1268
	}
1269
	
1265 1270
	my $fileNum     = shift;
1266 1271
	my $fileHash    = param("upload_$fileNum");
1267 1272
	my $fileName    = param("uploadname_$fileNum");
......
1276 1281
		( $docid, $fileHash ) = datafileInfo($fileHash);
1277 1282
		$outFile = $dataDir . "/" . $docid;
1278 1283

  
1279
	}
1280
	else {
1284
	} else {
1281 1285

  
1282 1286
		# normalize input filenames; Windows filenames include full paths
1283 1287
		$cleanName =~ s/.*[\/\\](.*)/$1/;
......
1299 1303
	}
1300 1304

  
1301 1305
	# remove the uniqueness of the filename
1302
	# 'tempXXXXX'
1303
	$cleanName = substr($cleanName, 9);
1306
	# 'tempXXXXX' if it exists
1307
	if ( $cleanName =~ /^temp[A-Za-z0-9_]{5}/ && length($cleanName) > 9 ) {
1308
		$cleanName = substr($cleanName, 9);
1309
		
1310
	}
1304 1311

  
1305 1312
	if ( !$docid ) {
1306 1313

  
......
1343 1350
	return ( $docid, \%dataInfo );
1344 1351
}
1345 1352

  
1353
# Returns the docid and SHA1 hash from the colon-delimited string
1346 1354
sub datafileInfo {
1347 1355
	my $finfo = shift;
1348 1356
	$finfo =~ s/ondisk://g;
......
1537 1545
#
1538 1546
################################################################################
1539 1547
sub createXMLDocument {
1540
    if ( $debug_enabled ) {
1541
        debug("createXMLDocument() called.");
1542

  
1543
    }
1544

  
1545

  
1548
	if ( $debug_enabled ) {
1549
	    debug("createXMLDocument() called.");
1550
	
1551
	}
1552
	
1546 1553
	#FIXME placeholder for $FORM element, should be determined by config
1547 1554

  
1548 1555
	if ( $skinName eq "ebm" ) {
......
1558 1565
	$doc .= accessElement();
1559 1566
	$doc .= datasetStart();
1560 1567
	$doc .= titleElement();
1561
	$doc .= creatorNameElement();
1562
	$doc .= creatorElement();
1563

  
1568
	$doc .= createParties('creator');
1569
	if ( $hasMetadataProvider > 0 ) {
1570
		$doc .= createParties('metadataProvider');
1571
		
1572
	} else {
1573
		copyFirstCreator('metadataProvider');
1574
		$doc .= createParties('metadataProvider');
1575
		
1576
	}
1564 1577
	$doc .= pubElement();
1565 1578
	$doc .= setDisplayType('project');
1566 1579
	$doc .= keywordElement();
1567
	$doc .= contactElement();
1580
	if ( $hasContact > 0 ) {
1581
		$doc .= createParties('contact');
1582
		
1583
	} else {
1584
		copyFirstCreator('contact');
1585
		$doc .= createParties('contact');
1586
		
1587
	}
1568 1588

  
1569 1589
	# putting everything else under project
1570 1590
	$doc .= "<project>";
1571 1591
	$doc .= titleElement();
1572
	my %originators = personnelCreate('personnel');
1573
	$doc .= personnelList( \%originators );
1592
	$doc .= createParties('personnel');
1574 1593
	$doc .= abstractElement();
1575 1594
	$doc .= "<studyAreaDescription>\n";
1576 1595
	$doc .= coverageElement();
1577 1596
	$doc .= "</studyAreaDescription>\n";
1578

  
1579 1597
	$doc .= "</project>";
1580 1598
	$doc .= datasetEnd();
1581 1599
	$doc .= EMLEnd();
......
1584 1602

  
1585 1603
sub createDatasetDocument {
1586 1604

  
1587
    if ( $debug_enabled ) {
1588
        debug("createDatasetDocument() called.");
1605
	if ( $debug_enabled ) {
1606
		debug("createDatasetDocument() called.");
1607
	
1608
	}
1589 1609

  
1590
    }
1591

  
1592
    my $doc = EMLStart();
1610
	my $doc = EMLStart();		
1593 1611
	$doc .= accessElement();
1594 1612
	$doc .= datasetStart();
1595 1613
	$doc .= titleElement();
1596
	$doc .= creatorElement();
1597
	$doc .= creatorContactElement();
1598
	my %originators = personnelCreate('associatedParty');
1599
	$doc .= personnelList( \%originators );
1600

  
1614
	$doc .= createParties('creator');
1615
	if ( $hasMetadataProvider > 0 ) {
1616
		$doc .= createParties('metadataProvider');
1617
		
1618
	} else {
1619
		copyFirstCreator('metadataProvider');
1620
		$doc .= createParties('metadataProvider');
1621
		
1622
	}
1623
	$doc .= createParties('associatedParty');
1601 1624
	$doc .= pubElement();
1602 1625
	$doc .= abstractElement();
1603

  
1604
	#    $doc .= setDisplayType('dataset');
1605 1626
	$doc .= keywordElement();
1606 1627
	$doc .= distributionElement();
1607 1628
	$doc .= coverageElement();
1608
	$doc .= contactElement();
1629
	if ( $hasContact > 0 ) {
1630
		$doc .= createParties('contact');
1631
		
1632
	} else {
1633
		copyFirstCreator('contact');
1634
		$doc .= createParties('contact');
1635
		
1636
	}
1637
	$doc .= createParties('publisher');
1609 1638
	$doc .= methodsElement();
1610 1639
	$doc .= fundingElement();
1611 1640
	my %fileData = allFileData();
......
1616 1645

  
1617 1646
# EML document creation functions
1618 1647

  
1619
sub personnelCreate {
1648
# Build a party element based on the party type passed in and the submitted party form fields.
1649
# Party types are limited to:
1650
#     creator, contact, metadataProvider, publisher, personnel, and associatedParty
1651
sub createParties {
1620 1652

  
1621
	# passed parameter defines default role for individuals
1622
	my $defaultRole = shift;
1653
	my $partyType = shift;
1654
	my $partiesStr = "";
1655
	my $partyStr = "";
1656
	my @associatedPartyRoles = [
1657
		'principalInvestigator',
1658
		'coPrincipalInvestigator',
1659
		'collaboratingPrincipalInvestigator',
1660
		'custodianSteward',
1661
		'user'];
1662
	
1663
	# Process the party* parameters, first getting the indexed number
1664
  foreach my $paramName ( param() ) {
1623 1665

  
1624
	# element name => objects of that type
1625
	my %orig = (
1626
		'creator'          => [],
1627
		'metadataProvider' => [],
1628
		'publisher'        => [],
1629
		$defaultRole       => [],
1630
	);
1666
		$partyStr = "";
1667
		my $partyNumber = $paramName;
1668
		$partyNumber =~ s/partyRole//; # indexed number 1, 2, 3, etc
1669
		
1670
		# Check that the party number is valid
1671
		if ( $partyNumber =~ /^([0-9]+)$/) {
1631 1672

  
1632
	# form name => EML element name
1633
	my %roles = (
1634
		'Originator'        => 'creator',
1635
		'Metadata Provider' => 'metadataProvider',
1636
		'Publisher'         => 'publisher',
1637
	);
1673
			# The role we're processing
1674
			my $partyRole = normalize(param("partyRole" . $partyNumber));
1675
			
1676
			# Find the first creator index in the parties if present
1677
			if ( $partyRole eq "creator" && $firstCreatorIndex == -1 ) {
1678
				$firstCreatorIndex = $partyNumber;
1679
			} 
1638 1680

  
1639
	push(
1640
		@{ $orig{'metadataProvider'} },
1641
		[ $FORM::providerGivenName, $FORM::providerSurName ]
1642
	);
1681
			# Find the first metadataProvider in the parties if present
1682
			if ( $partyRole eq "metadataProvider" ) {
1683
				$hasMetadataProvider = 1;
1684
			} 
1643 1685

  
1644
	# Additional originators
1645
	foreach my $origName ( param() ) {
1646
		my $origNum = $origName;
1647
		$origNum =~ s/origNamelast//;   # get the index of the parameter 0 to 10
1648
		if ( $origNum =~ /^([0-9]+)$/ ) {
1686
			# Find the first contact in the parties if present
1687
			if ( $partyRole eq "contact" ) {
1688
				$hasContact = 1;
1689
			} 
1649 1690

  
1650
			# do not generate EML for empty originator fields
1651
			if ( hasContent( param( "origNamefirst" . $origNum ) ) ) {
1652
				my $first    = normalize( param( "origNamefirst" . $origNum ) );
1653
				my $last     = normalize( param( "origNamelast" . $origNum ) );
1654
				my $origRole = param( "origRole" . $origNum );
1655
				my $roleName = $roles{$origRole};
1656
				if ( !hasContent($roleName) ) {
1657
					$roleName = $defaultRole;
1658
				}
1659

  
1660
				push( @{ $orig{$roleName} }, [ $first, $last, $origRole ] );
1691
			# Process roles corresponding to specific EML elements
1692
			if ( $partyRole eq $partyType ) {
1693
                debug("Role: " . $partyRole . " matches Type: " . $partyType );
1694
				$partyStr = createParty( $partyType, $partyRole, $partyNumber); 
1695
			# handle associated parties
1696
			} elsif ( $partyType eq "associatedParty" && $partyRole ~~ @associatedPartyRoles ) {
1697
				$partyStr = createParty( $partyType, $partyRole, $partyNumber); 
1698
                debug("Asscociated Party Type: " . $partyType . " and Role: " . $partyRole . " is in @associatedPartyRoles");
1699
				
1700
			# handle personnel
1701
			} elsif ( $partyType eq "personnel" && $partyRole ~~ @associatedPartyRoles ) {
1702
				$partyStr = createParty( $partyType, $partyRole, $partyNumber); 
1703
                debug("Personnel Type: " . $partyType . " and Role: " . $partyRole . " is in @associatedPartyRoles");
1704
			
1661 1705
			}
1662 1706
		}
1663
	}
1664
	return %orig;
1707
		$partiesStr .= $partyStr;
1708
  }	
1709
	
1710
	return $partiesStr;
1665 1711
}
1666 1712

  
1667
sub personnelList {
1668
	my ( $orig, $type ) = @_;
1669
	my %orig = %$orig;
1713
# Build an EML party based on the given element type (creator, associatedParty, contact, publisher, personnel)
1714
sub createParty() {
1715
	my $partyType = shift;
1716
	my $partyRole = shift;
1717
	my $partyNumber = shift;
1718
	
1719
	my $partyStr         = "";
1720
	my $partyRole        = "";						
1721
	my $partyId          = "";		
1722
	my $partyFirstName   = "";		
1723
	my $partyLastName    = "";		
1724
	my $partyOrgName     = "";		
1725
	my $partyPositionName = "";		
1726
	my $partyEmail       = "";		
1727
	my $partyURL         = "";		
1728
	my $partyPhone       = "";		
1729
	my $partyFAX         = "";		
1730
	my $partyDelivery    = "";		
1731
	my $partyCity        = "";		
1732
	my $partyState       = "";		
1733
	my $partyStateOther  = "";		
1734
	my $partyZIP         = "";		
1735
	my $partyCountry     = "";		
1736
	my $individualName   = "";
1737
	my $organizationName = "";
1738
	my $positionName     = "";
1739
	my $address          = "";
1740
	my $phone            = "";
1741
	my $fax              = ""; 
1742
	my $email            = "";
1743
	my $onlineUrl        = "";
1744
	my $role             = "";
1745
	
1746
	if ( hasContent(param("partyRole" . $partyNumber))) {
1747
		$partyRole = normalize(param("partyRole" . $partyNumber));
1748
		$role .= "<role>";
1749
		$role .= $partyRole;
1750
		$role .= "</role>\n";
1751
	}
1752
							
1753
	if ( hasContent(param("partyId" . $partyNumber))) {
1754
		$partyId = normalize(param("partyId" . $partyNumber));
1755
		
1756
	} else {
1757
		$partyId = int(rand(10000000000000000));
1758
	}
1759
			
1760
	if ( hasContent(param("partyLastName" . $partyNumber))) {
1761
		$individualName .= "<individualName>\n";
1762
		if ( hasContent(param("partyFirstName" . $partyNumber))) {
1763
			$partyFirstName = normalize(param("partyFirstName" . $partyNumber));
1764
			$individualName .= "<givenName>";
1765
			$individualName .= $partyFirstName;
1766
			$individualName .= "</givenName>\n";
1767
			
1768
		}
1769
		$partyLastName = normalize(param("partyLastName" . $partyNumber));
1770
		$individualName .= "<surName>";
1771
		$individualName .= $partyLastName;
1772
		$individualName .= "</surName>\n";
1773
		$individualName .= "</individualName>\n";
1774
			
1775
	}
1776
			
1777
	if ( hasContent(param("partyOrgName" . $partyNumber))) {
1778
		$organizationName .= "<organizationName>";
1779
		$partyOrgName = normalize(param("partyOrgName" . $partyNumber));
1780
		$organizationName .= $partyOrgName;
1781
		$organizationName .= "</organizationName>\n";
1782
		
1783
	}
1784
	
1785
	if ( hasContent(param("partyPositionName" . $partyNumber))) {
1786
		$positionName .= "<positionName>";
1787
		$partyPositionName = normalize(param("partyPositionName" . $partyNumber));
1788
		$positionName .= $partyPositionName;
1789
		$positionName .= "</positionName>\n";
1790
		
1791
	}
1792
	
1793
	$address .= "<address>";
1794
	
1795
	if ( hasContent(param("partyDelivery" . $partyNumber))) {
1796
		$partyDelivery = normalize(param("partyDelivery" . $partyNumber));
1797
		$address .= "<deliveryPoint>";
1798
		$address .= $partyDelivery;
1799
		$address .= "</deliveryPoint>\n";
1800
		
1801
	}
1802
			
1803
	if ( hasContent(param("partyCity" . $partyNumber))) {
1804
		$partyCity = normalize(param("partyCity" . $partyNumber));
1805
		$address .= "<city>";
1806
		$address .= $partyCity;
1807
		$address .= "</city>\n";
1808
		
1809
	}
1810
			
1811
	if ( hasContent(param("partyState" . $partyNumber))) {
1812
		$partyState = normalize(param("partyState" . $partyNumber));
1813
		$address .= "<administrativeArea>";
1814
		$address .= $partyState;
1815
		$address .= "</administrativeArea>\n";
1816
		
1817
	} elsif ( hasContent(param("partyStateOther" . $partyNumber))) {
1818
		$partyStateOther = normalize(param("partyStateOther" . $partyNumber));
1819
		$address .= "<administrativeArea>";
1820
		$address .= $partyStateOther;
1821
		$address .= "</administrativeArea>\n";
1822
	}
1823
			
1824
	if ( hasContent(param("partyZIP" . $partyNumber))) {
1825
		$partyZIP = normalize(param("partyZIP" . $partyNumber));
1826
		$address .= "<postalCode>";
1827
		$address .= $partyZIP;
1828
		$address .= "</postalCode>\n";
1829
		
1830
	}
1831
		
1832
	if ( hasContent(param("partyCountry" . $partyNumber))) {
1833
		$partyCountry = normalize(param("partyCountry" . $partyNumber));
1834
		$address .= "<country>";
1835
		$address .= $partyCountry;
1836
		$address .= "</country>\n";
1837
		
1838
	}
1839
	
1840
	$address .= "</address>\n";
1670 1841

  
1671
	my $elemList = "";
1672
	foreach my $role ( keys %orig ) {
1673
		foreach my $v ( @{ $orig->{$role} } ) {
1674
			my ( $first, $last, $origRole ) = @$v;
1675
			my $elem = "<individualName>\n";
1676
			$elem .= "<givenName>" . normalize($first) . "</givenName>\n";
1677
			$elem .= "<surName>" . normalize($last) . "</surName>\n";
1678
			$elem .= "</individualName>\n";
1842
	if ( hasContent(param("partyPhone" . $partyNumber))) {
1843
		$partyPhone = normalize(param("partyPhone" . $partyNumber));
1844
		$phone .= "<phone phonetype=\"voice\">";
1845
		$phone .= $partyPhone;
1846
		$phone .= "</phone>\n";
1847
	}
1848
			
1849
	if ( hasContent(param("partyFAX" . $partyNumber))) {
1850
		$partyFAX = normalize(param("partyFAX" . $partyNumber));
1851
		$fax .= "<phone phonetype=\"facsimile\">";
1852
		$fax .= $partyFAX;
1853
		$fax .= "</phone>\n";
1854
		
1855
	}
1856
	
1857
	if ( hasContent(param("partyEmail" . $partyNumber))) {
1858
		$partyEmail = normalize(param("partyEmail" . $partyNumber));
1859
		$email .= "<electronicMailAddress>";
1860
		$email .= $partyEmail;
1861
		$email .= "</electronicMailAddress>\n";
1862
	}
1863
					
1864
	if ( hasContent(param("partyURL" . $partyNumber))) {
1865
		$partyURL = normalize(param("partyURL" . $partyNumber));
1866
		$onlineUrl .= "<onlineUrl>";
1867
		$onlineUrl .= $partyURL;
1868
		$onlineUrl .= "</onlineUrl>\n";
1869
	}
1870
					
1871
	# add the party begin tag (like <creator>)
1872
	$partyStr .= "<" . $partyType . " id=\"" . $partyId ."\">\n";
1873
	
1874
	# add in the person
1875
	if ( $individualName ne "" ) {
1876
		$partyStr .= $individualName;
1877
		
1878
	} 
1679 1879

  
1680
			if ( ( $role eq 'personnel' ) && ($FORM::origNameOrgContact) ) {
1681
				$elem .= "<organizationName>$FORM::origNameOrgContact</organizationName>\n";
1682
			}
1880
	# add in the organization
1881
	if ( $organizationName ne "" ) {
1882
		$partyStr .= $organizationName;
1883
		
1884
	} 
1683 1885

  
1684
			if ( ( $role eq 'personnel' ) || ( $role eq 'associatedParty' ) ) {
1685
				my $roleElem = $role;
1686
				if ( hasContent($origRole) ) {
1687
					$roleElem = $origRole;
1688
				}
1689
				$elem .= "<role>" . normalize($roleElem) . "</role>\n";
1690
			}
1691
                        # Ensure the metadataProvider is added before additionalParty
1692
                        my $fullElement = "<$role>$elem</$role>\n";
1693
                        if ( $role eq "metadataProvider" ) {
1694
				$fullElement .= $elemList;
1695
				$elemList = $fullElement;
1886
	# add in the position
1887
	if ( $positionName ne "" ) {
1888
		$partyStr .= $positionName;
1889
		
1890
	} 
1696 1891

  
1697
                        } else {
1698
				$elemList .= $fullElement;
1892
	# add in the address
1893
	if ( $address ne "" || $address ne "<address></address>\n") {
1894
		$partyStr .= $address;
1895
		
1896
	} 
1699 1897

  
1700
			}
1701
		}
1898
	# add in the phone
1899
	if ( $phone ne "") {
1900
		$partyStr .= $phone;
1901
		
1902
	} 
1903

  
1904
	# add in the fax
1905
	if ( $fax ne "") {
1906
		$partyStr .= $fax;
1907
		
1908
	} 
1909

  
1910
	# add in the email
1911
	if ( $email ne "") {
1912
		$partyStr .= $email;
1913
		
1702 1914
	}
1703
	return $elemList;
1915
	
1916
	# add in the online URL
1917
	if ( $onlineUrl ne "") {
1918
		$partyStr .= $onlineUrl;
1919
		
1920
	}
1921
	
1922
	if ( $partyType eq "associatedParty" || $partyType eq "personnel" ) {
1923
			$partyStr .= $role;
1924
			
1925
	}
1926

  
1927
	# add the party end tag (like </creator>)
1928
	$partyStr .= "</" . $partyType . ">\n";
1929
			
1704 1930
}
1705 1931

  
1706 1932
sub entityElement() {
......
1899 2125
	  . "</para>\n</abstract>\n";
1900 2126
}
1901 2127

  
1902
sub creatorElement() {
2128
sub partyElement() {
1903 2129
	my $creators;
1904 2130
	if ( $skinName eq 'nceas' ) {
1905 2131
		for ( my $i = 0 ; $i < scalar(@FORM::wg) ; $i++ ) {
......
1943 2169

  
1944 2170
	$creator .= "<individualName>\n";
1945 2171
	$creator .=
1946
	  "<givenName>" . normalize($FORM::origNamefirst0) . "</givenName>\n";
1947
	$creator .= "<surName>" . normalize($FORM::origNamelast0) . "</surName>\n";
2172
	  "<givenName>" . normalize($FORM::partyFirstName0) . "</givenName>\n";
2173
	$creator .= "<surName>" . normalize($FORM::partyLastName0) . "</surName>\n";
1948 2174
	$creator .= "</individualName>\n";
1949 2175

  
1950 2176
	return "<$role>\n$creator</$role>\n";
......
1983 2209
}
1984 2210

  
1985 2211
sub fundingElement() {
1986
    my $project = "";
2212
	if ( $debug_enabled ) {
2213
		debug("fundingElement() called.");
2214
	}
2215
		
2216
		my $project = "";
1987 2217

  
1988 2218
    if ( hasContent($FORM::funding) ) {
1989 2219

  
......
1997 2227
        $project .= "<personnel>\n" .
1998 2228
                    "<individualName>\n" .
1999 2229
                    "<givenName>" .
2000
                    normalize($FORM::origNamefirst0) .
2230
                    normalize($FORM::partyFirstName0) .
2001 2231
                    "</givenName>\n" .
2002 2232
                    "<surName>" .
2003
                    normalize($FORM::origNamelast0) .
2233
                    normalize($FORM::partyLastName0) .
2004 2234
                    "</surName>\n" .
2005 2235
                    "</individualName>\n";
2006 2236
        # Add a default role
......
2008 2238
                    "</personnel>\n";
2009 2239

  
2010 2240
        # Add the funding info (grant number)
2011
        $project .= "<funding>" .
2012
                    normalize($FORM::funding) .
2013
                    "</funding>\n";
2241
        $project .= "<funding>\n";                    
2242

  
2243
        # split funding by comma delimiter
2244
        my $funding = normalize($FORM::funding);
2245
        foreach my $para (split(',', $funding)) {
2246
        	$project .= "<para>" .
2247
                    $para .
2248
                    "</para>\n";
2249
        }
2250
                    
2251
        $project .= "</funding>\n";                    
2014 2252
        $project .= "</project>\n";
2015 2253
    }
2016 2254

  
2017 2255
    return $project;
2018 2256
}
2019 2257

  
2020
sub creatorContactElement() {
2258
sub partyElement() {
2021 2259
	my $cont = "";
2260
	if ( hasContent($FORM::partyLastName) ) {
2261
		$cont .= "<individualName>\n";
2262
		if ( hasContent($FORM::partyFirstName) ) {
2263
			$cont .= "<givenName>" . normalize($FORM::partyFirstName) . "</givenName>\n";
2264
		}
2265
		$cont .= "<surName>" . normalize($FORM::partyLastName) . "</surName>\n";
2266
		$cont .= "</individualName>\n";
2267
	}
2022 2268

  
2023
	$cont .= "<individualName>\n";
2024
	$cont .=
2025
	  "<givenName>" . normalize($FORM::origNamefirst0) . "</givenName>\n";
2026
	$cont .=
2027
	  "<surName>" . normalize($FORM::origNamelast0) . "</surName>\n";
2028
	$cont .= "</individualName>\n";
2029

  
2030
	if ( hasContent($FORM::origNameOrg) ) {
2269
	if ( hasContent($FORM::partyOrgName) ) {
2031 2270
		$cont .=
2032 2271
		    "<organizationName>"
2033
		  . normalize($FORM::origNameOrg)
2272
		  . normalize($FORM::partyOrgName)
2034 2273
		  . "</organizationName>\n";
2035 2274
	}
2036 2275

  
2037
	if (   hasContent($FORM::origDelivery)
2038
		|| hasContent($FORM::origCity)
2039
		|| hasContent($FORM::origState)
2040
		|| hasContent($FORM::origStateOther)
2041
		|| hasContent($FORM::origZIP)
2042
		|| hasContent($FORM::origCountry) )
2276
	if (   hasContent($FORM::partyDelivery)
2277
		|| hasContent($FORM::partyCity)
2278
		|| hasContent($FORM::partyState)
2279
		|| hasContent($FORM::partyStateOther)
2280
		|| hasContent($FORM::partyZIP)
2281
		|| hasContent($FORM::partyCountry) )
2043 2282
	{
2044 2283
		$cont .= "<address>\n";
2045
		if ( hasContent($FORM::origDelivery) ) {
2046
			$cont .= "<deliveryPoint>" . normalize($FORM::origDelivery);
2284
		if ( hasContent($FORM::partyDelivery) ) {
2285
			$cont .= "<deliveryPoint>" . normalize($FORM::partyDelivery);
2047 2286
			$cont .= "</deliveryPoint>\n";
2048 2287
		}
2049
		if ( hasContent($FORM::origCity) ) {
2050
			$cont .= "<city>" . normalize($FORM::origCity) . "</city>\n";
2288
		if ( hasContent($FORM::partyCity) ) {
2289
			$cont .= "<city>" . normalize($FORM::partyCity) . "</city>\n";
2051 2290
		}
2052
		if ( hasContent($FORM::origState)
2053
			&& ( $FORM::origState !~ /select state/i ) )
2291
		if ( hasContent($FORM::partyState)
2292
			&& ( $FORM::partyState !~ /select state/i ) )
2054 2293
		{
2055 2294
			$cont .=
2056
			  "<administrativeArea>" . normalize($FORM::origState);
2295
			  "<administrativeArea>" . normalize($FORM::partyState);
2057 2296
			$cont .= "</administrativeArea>\n";
2058 2297
		}
2059
		elsif ( hasContent($FORM::origStateOther) ) {
2298
		elsif ( hasContent($FORM::partyStateOther) ) {
2060 2299
			$cont .=
2061
			  "<administrativeArea>" . normalize($FORM::origStateOther);
2300
			  "<administrativeArea>" . normalize($FORM::partyStateOther);
2062 2301
			$cont .= "</administrativeArea>\n";
2063 2302
		}
2064
		if ( hasContent($FORM::origZIP) ) {
2303
		if ( hasContent($FORM::partyZIP) ) {
2065 2304
			$cont .=
2066 2305
			    "<postalCode>"
2067
			  . normalize($FORM::origZIP)
2306
			  . normalize($FORM::partyZIP)
2068 2307
			  . "</postalCode>\n";
2069 2308
		}
2070
		if ( hasContent($FORM::origCountry) ) {
2309
		if ( hasContent($FORM::partyCountry) ) {
2071 2310
			$cont .=
2072 2311
			    "<country>"
2073
			  . normalize($FORM::origCountry)
2312
			  . normalize($FORM::partyCountry)
2074 2313
			  . "</country>\n";
2075 2314
		}
2076 2315
		$cont .= "</address>\n";
2077 2316
	}
2078
	if ( hasContent($FORM::origPhone) ) {
2079
		$cont .= "<phone>" . normalize($FORM::origPhone) . "</phone>\n";
2317
	if ( hasContent($FORM::partyPhone) ) {
2318
		$cont .= "<phone>" . normalize($FORM::partyPhone) . "</phone>\n";
2080 2319
	}
2081
	if ( hasContent($FORM::origFAXContact) ) {
2320
	if ( hasContent($FORM::partyFAXContact) ) {
2082 2321
		$cont .=
2083 2322
		    "<phone phonetype=\"Fax\">"
2084
		  . normalize($FORM::origFAXContact)
2323
		  . normalize($FORM::partyFAXContact)
2085 2324
		  . "</phone>\n";
2086 2325
	}
2087
	if ( hasContent($FORM::origEmail) ) {
2088
		$cont .= "<electronicMailAddress>" . normalize($FORM::origEmail);
2326
	if ( hasContent($FORM::partyEmail) ) {
2327
		$cont .= "<electronicMailAddress>" . normalize($FORM::partyEmail);
2089 2328
		$cont .= "</electronicMailAddress>\n";
2090 2329
	}
2091 2330

  
2331
	if ( hasContent($FORM::partyURL) ) {
2332
		$cont .= "<onlineUrl>" . normalize($FORM::partyURL);
2333
		$cont .= "</onlineUrl>\n";
2334
	}
2335

  
2092 2336
	return "<creator>\n$cont</creator>\n";
2093 2337
}
2094 2338

  
......
2102 2346

  
2103 2347
	$cont .= "<individualName>\n";
2104 2348
	$cont .=
2105
	  "<givenName>" . normalize($FORM::origNamefirstContact) . "</givenName>\n";
2349
	  "<givenName>" . normalize($FORM::partyFirstNameContact) . "</givenName>\n";
2106 2350
	$cont .=
2107
	  "<surName>" . normalize($FORM::origNamelastContact) . "</surName>\n";
2351
	  "<surName>" . normalize($FORM::partyLastNameContact) . "</surName>\n";
2108 2352
	$cont .= "</individualName>\n";
2109 2353

  
2110
	if ( hasContent($FORM::origNameOrgContact) ) {
2354
	if ( hasContent($FORM::partyOrgNameContact) ) {
2111 2355
		$cont .=
2112 2356
		    "<organizationName>"
2113
		  . normalize($FORM::origNameOrgContact)
2357
		  . normalize($FORM::partyOrgNameContact)
2114 2358
		  . "</organizationName>\n";
2115 2359
	}
2116 2360

  
......
2699 2943

  
2700 2944
################################################################################
2701 2945
#
2946
# Parse getaccesscontrol XML response
2947
# from Metacat and return the allow elements
2948
#
2949
################################################################################
2950
sub getAllowAccess {
2951
	
2952
	my $docid = shift;
2953
	debug("looking up access control block for docid: $docid");
2954
	
2955
	# read the access control block
2956
	my $parser = XML::LibXML->new();
2957

  
2958
	my $metacat = Metacat->new($metacatUrl);
2959
    setAuthToken($metacat);
2960
    
2961
	my $response = $metacat->getaccess($docid);
2962
	my $doc    = $response->content();
2963
	debug("Retrieved access control block: $doc");
2964
	my $xmldoc = $parser->parse_string($doc);
2965
	if ( $xmldoc eq "" || $doc =~ /<error/ ) {
2966

  
2967
		# not able to parse
2968
		my $errorMessage =
2969
		  "Error in retrieving access control for docid:" . $docid;
2970
		  
2971
	}
2972
	
2973
	# return the allow access nodes
2974
	my $results = $xmldoc->findnodes('/access/allow');
2975

  
2976
	return $results;
2977
}
2978

  
2979
################################################################################
2980
#
2702 2981
# Parse an EML 2.x file and extract the metadata into perl variables for
2703 2982
# processing and returning to the template processor
2704 2983
#
......
2712 2991
	my $node;
2713 2992
	my $tempResult;
2714 2993
	my $tempNode;
2715
	my $aoCount = 0;
2994
	my $partyCount = 0;
2716 2995
	my $foundDSO;
2717 2996

  
2718 2997
	# set variable values
......
2724 3003
	# perform any required transformation
2725 3004
	$doc = transformEml($doc);
2726 3005

  
2727
	# find out the tag <alternateIdentifier>.
3006
	# Find <alternateIdentifier>.
2728 3007
	$results = $doc->findnodes('//dataset/alternateIdentifier');
2729 3008
	if ( $results->size() > 0 ) {		
2730 3009
		# handle multiple alternate identifiers
......
2740 3019
	}
2741 3020
	
2742 3021

  
2743
	# find out the tag <title>.
3022
	# Find <title>.
2744 3023
	$results = $doc->findnodes('//dataset/title');
2745 3024
	if ( $results->size() > 1 ) {
2746 3025
		errMoreThanOne("title");
2747
	}
2748
	elsif ( $results->size() < 1 ) {
3026
		
3027
	} elsif ( $results->size() < 1 ) {
2749 3028
		$error = "Following tag not found: title. Please use Morpho to edit this document";
2750 3029
		push( @errorMessages, $error . "\n" );
2751
	}
2752
	else {
3030
		
3031
	} else {
2753 3032
		foreach $node ( $results->get_nodelist ) {
2754 3033
			$$templateVars{'title'} = findValue( $node, '../title' );
2755 3034
		}
3035
		
2756 3036
	}
2757 3037

  
2758
	# find out the tag <creator>.
2759
	$results = $doc->findnodes('//dataset/creator/individualName');
2760
	debug( "Creators: " . $results->size() );
2761
	foreach $node ( $results->get_nodelist ) {
2762
		dontOccur(
2763
			$node,
2764
			"../positionName|../onlineURL|../userId",
2765
			"positionName, onlineURL, userId"
2766
		);
3038
	# Find <creator>s 
3039
	populatePartyFields(\$doc, "//dataset/creator", \$partyCount);
3040
	
3041
	# Find <metadataProvider>s 
3042
	populatePartyFields(\$doc, "//dataset/metadataProvider", \$partyCount);
2767 3043

  
2768
		dontOccur( $node, "./salutation", "salutation" );
3044
	# Find <associatedParty>s 
3045
	populatePartyFields(\$doc, "//dataset/associatedParty", \$partyCount);
2769 3046

  
2770
		debug("Checking a creator in loop 1...");
2771
		$tempResult = $node->findnodes(
2772
			'../address|../phone|../electronicmailAddress|../organizationName');
2773
		if ( $tempResult->size > 0 ) {
2774
			if ( $foundDSO == 0 ) {
2775
				$foundDSO = 1;
3047
	# Find <publisher>s 
3048
	populatePartyFields(\$doc, "//dataset/publisher", \$partyCount);
2776 3049

  
2777
				debug("Recording a creator in loop 1...");
2778
				$$templateVars{'origNamefirst0'} =
2779
				  findValue( $node, 'givenName' );
2780
				$$templateVars{'origNamelast0'} = findValue( $node, 'surName' );
3050
	# Find <contact>s 
3051
	populatePartyFields(\$doc, "//dataset/contact", \$partyCount);
2781 3052

  
2782
				my $tempResult2 = $node->findnodes('../address');
2783
				if ( $tempResult2->size > 1 ) {
2784
					errMoreThanOne("address");
2785
				}
2786
				else {
2787
					foreach my $tempNode2 ( $tempResult2->get_nodelist ) {
2788
						$$templateVars{'origDelivery'} =
2789
						  findValue( $tempNode2, 'deliveryPoint' );
2790
						$$templateVars{'origCity'} =
2791
						  findValue( $tempNode2, 'city' );
2792
						$$templateVars{'origState'} =
2793
						  findValue( $tempNode2, 'administrativeArea' );
2794
						$$templateVars{'origZIP'} =
2795
						  findValue( $tempNode2, 'postalCode' );
2796
						$$templateVars{'origCountry'} =
2797
						  findValue( $tempNode2, 'country' );
2798
					}
2799
				}
3053
	$$templateVars{'partyCount'} = $partyCount;
2800 3054

  
2801
				my $tempResult3 = $node->findnodes('../phone');
2802
				if ( $tempResult3->size > 2 ) {
2803
					errMoreThanN("phone");
2804
				}
2805
				else {
2806
					foreach my $tempNode2 ( $tempResult3->get_nodelist ) {
2807
						if ( $tempNode2->hasAttributes() ) {
2808
							my @attlist = $tempNode2->attributes();
2809
							if ( $attlist[0]->value eq "Fax" ) {
2810
								$$templateVars{'origFAX'} =
2811
								  $tempNode2->textContent();
2812
							}
2813
							else {
2814
								$$templateVars{'origPhone'} =
2815
								  $tempNode2->textContent();
2816
							}
2817
						}
2818
						else {
2819
							$$templateVars{'origPhone'} =
2820
							  $tempNode2->textContent();
2821
						}
2822
					}
2823
				}
2824
				$$templateVars{'origEmail'} =
2825
				  findValue( $node, '../electronicMailAddress' );
2826
				$$templateVars{'origNameOrg'} =
2827
				  findValue( $node, '../organizationName' );
2828
			}
2829
			else {
2830
				errMoreThanN("address, phone and electronicMailAddress");
2831
			}
2832
		}
2833
	}
2834
	foreach $node ( $results->get_nodelist ) {
2835
		debug("Checking a creator in loop 2...");
2836
		$tempResult = $node->findnodes(
2837
			'../address|../phone|../electronicmailAddress|../organizationName');
2838
		if ( $tempResult->size == 0 ) {
2839
			if ( $foundDSO == 0 ) {
2840
				debug("Recording a creator in loop 2 block A...");
2841
				$foundDSO = 1;
2842
				$$templateVars{'origNamefirst0'} =
2843
				  findValue( $node, 'givenName' );
2844
				$$templateVars{'origNamelast0'} = findValue( $node, 'surName' );
2845
				$$templateVars{'origNameOrg'} =
2846
				  findValue( $node, '../organizationName' );
2847
			}
2848
			else {
2849
				debug("Recording a creator in loop 2 block B...");
2850
				$$templateVars{"origNamefirst$aoCount"} =
2851
				  findValue( $node, './givenName' );
2852
				$$templateVars{"origNamelast$aoCount"} =
2853
				  findValue( $node, './surName' );
2854
				$$templateVars{"origRole$aoCount"} = "Originator";
2855
				$aoCount++;
2856
			}
2857
		}
2858
	}
2859

  
2860
	$results = $doc->findnodes('//dataset/creator/organizationName');
2861
	my $wgroups = $doc->findnodes(
2862
		"//dataset/creator/organizationName[contains(text(),'(NCEAS ')]");
2863
	debug( "Number Org: " . $results->size() );
2864
	debug( " Number WG: " . $wgroups->size() );
2865
	if ( $results->size() - $wgroups->size() > 3 ) {
2866
		errMoreThanN("creator/organizationName");
2867
	}
2868
	else {
2869
		foreach $node ( $results->get_nodelist ) {
2870
			my $tempValue = findValue( $node, '../organizationName' );
2871
			$tempResult = $node->findnodes('../individualName');
2872
			if (   $tempResult->size == 0
2873
				&& $tempValue ne $config->{'organization'} )
2874
			{
2875
				$$templateVars{'site'} = $tempValue;
2876
			}
2877
		}
2878
		if ( $skinName eq 'nceas' ) {
2879
			my @wg;
2880
			foreach $node ( $results->get_nodelist ) {
2881
				my $tempValue = findValue( $node, '../organizationName' );
2882
				$wg[ scalar(@wg) ] = $tempValue;
2883
			}
2884
			my $projects = getProjectList($properties);
2885
			$$templateVars{'projects'} = $projects;
2886
			$$templateVars{'wg'}       = \@wg;
2887
		}
2888
	}
2889

  
2890
	$results = $doc->findnodes('//dataset/metadataProvider');
2891
	foreach $node ( $results->get_nodelist ) {
2892
		dontOccur(
2893
			$node,
2894
"./organizationName|./positionName|./onlineURL|./userId|./electronicMailAddress|./phone|./address",
2895
"organizationName, positionName, onlineURL, userId, electronicMailAddress, phone, address in metadataProvider"
2896
		);
2897

  
2898
		$tempResult = $node->findnodes('./individualName');
2899
		if ( $tempResult->size > 1 ) {
2900
			errMoreThanOne("metadataProvider/indvidualName");
2901
		}
2902
		else {
2903
			foreach $tempNode ( $tempResult->get_nodelist ) {
2904
				if ( $$templateVars{'providerGivenName'} ne "" ) {
2905
					$$templateVars{"origNamefirst$aoCount"} =
2906
					  findValue( $tempNode, './givenName' );
2907
					$$templateVars{"origNamelast$aoCount"} =
2908
					  findValue( $tempNode, './surName' );
2909
					$$templateVars{"origRole$aoCount"} = "Metadata Provider";
2910
					$aoCount++;
2911
				}
2912
				else {
2913
					$$templateVars{'providerGivenName'} =
2914
					  findValue( $tempNode, './givenName' );
2915
					$$templateVars{'providerSurName'} =
2916
					  findValue( $tempNode, './surName' );
2917
				}
2918
			}
2919
		}
2920
	}
2921

  
2922
	$results = $doc->findnodes('//dataset/associatedParty');
2923
	foreach $node ( $results->get_nodelist ) {
2924
		dontOccur(
2925
			$node,
2926
"./organizationName|./positionName|./onlineURL|./userId|./electronicMailAddress|./phone|./address",
2927
"organizationName, positionName, onlineURL, userId, electronicMailAddress, phone, address in associatedParty"
2928
		);
2929

  
2930
		$tempResult = $node->findnodes('./individualName');
2931
		if ( $tempResult->size > 1 ) {
2932
			errMoreThanOne("associatedParty/indvidualName");
2933
		}
2934
		else {
2935
			foreach $tempNode ( $tempResult->get_nodelist ) {
2936
				$$templateVars{"origNamefirst$aoCount"} =
2937
				  findValue( $tempNode, './givenName' );
2938
				$$templateVars{"origNamelast$aoCount"} =
2939
				  findValue( $tempNode, './surName' );
2940
				$$templateVars{"origRole$aoCount"} =
2941
				  findValue( $tempNode, '../role' );
2942
				$aoCount++;
2943
			}
2944
		}
2945
	}
2946

  
2947
	$results = $doc->findnodes('//dataset/publisher');
2948

  
2949
	#    if ($results->size() > 10) {
2950
	#       errMoreThanN("publisher");
2951
	#   } else {
2952
	foreach $node ( $results->get_nodelist ) {
2953
		dontOccur(
2954
			$node,
2955
			"./organizationName|./positionName|./onlineURL|./userId|./electronicMailAddress|./phone|./address",
2956
			"organizationName, positionName, onlineURL, userId, electronicMailAddress, phone, address in associatedParty"
2957
		);
2958

  
2959
		$tempResult = $node->findnodes('./individualName');
2960
		if ( $tempResult->size > 1 ) {
2961
			errMoreThanOne("publisher/indvidualName");
2962
		}
2963
		else {
2964
			foreach $tempNode ( $tempResult->get_nodelist ) {
2965
				$$templateVars{"origNamefirst$aoCount"} =
2966
				  findValue( $tempNode, './givenName' );
2967
				$$templateVars{"origNamelast$aoCount"} =
2968
				  findValue( $tempNode, './surName' );
2969
				$$templateVars{"origRole$aoCount"} = "Publisher";
2970
				$aoCount++;
2971
			}
2972
		}
2973
	}
2974

  
2975
	#  }
2976

  
2977
	#  if ($aoCount > 11) {
2978
	#      errMoreThanN("Additional Originators");
2979
	#   }
2980

  
2981
	$$templateVars{'aoCount'} = $aoCount;
2982

  
2983 3055
	dontOccur( $doc, "./pubDate",  "pubDate" );
2984 3056
	dontOccur( $doc, "./language", "language" );
2985 3057
	dontOccur( $doc, "./series",   "series" );
......
3043 3115
			dontOccur( $node, "./section", "section in intellectualRights" );
3044 3116

  
3045 3117
			$tempResult = $node->findnodes("para");
3046
			if ( $tempResult->size > 2 ) {
3118
			if ( $tempResult->size() > 2 ) {
3047 3119
				errMoreThanN("para");
3048 3120
			}
3049 3121
			else {
......
3129 3201
		foreach $node ( $results->get_nodelist ) {
3130 3202
			dontOccur(
3131 3203
				$node,
3132
				"./temporalCoverage/rangeOfDates/beginDate/time|./temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale|./temporalCoverage/rangeOfDates/endDate/time|./temporalCoverage/rangeOfDates/endDate/alternativeTimeScale|./taxonomicCoverage/taxonomicSystem|./taxonomicCoverage/taxonomicClassification/commonName|./taxonomicCoverage/taxonomicClassification/taxonomicClassification|./geographicCoverage/datasetGPolygon|./geographicCoverage/boundingCoordinates/boundingAltitudes",
3133
				"temporalCoverage/rangeOfDates/beginDate/time, /temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale, /temporalCoverage/rangeOfDates/endDate/time, /temporalCoverage/rangeOfDates/endDate/alternativeTimeScale, /taxonomicCoverage/taxonomicSystem, /taxonomicCoverage/taxonomicClassification/commonName, /taxonomicCoverage/taxonomicClassification/taxonomicClassification, /geographicCoverage/datasetGPolygon, /geographicCoverage/boundingCoordinates/boundingAltitudes"
3204
				"./temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale|./temporalCoverage/rangeOfDates/endDate/alternativeTimeScale|./taxonomicCoverage/taxonomicSystem|./taxonomicCoverage/taxonomicClassification/commonName|./taxonomicCoverage/taxonomicClassification/taxonomicClassification|./geographicCoverage/datasetGPolygon|./geographicCoverage/boundingCoordinates/boundingAltitudes",
3205
				"/temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale, /temporalCoverage/rangeOfDates/endDate/alternativeTimeScale, /taxonomicCoverage/taxonomicSystem, /taxonomicCoverage/taxonomicClassification/commonName, /taxonomicCoverage/taxonomicClassification/taxonomicClassification, /geographicCoverage/datasetGPolygon, /geographicCoverage/boundingCoordinates/boundingAltitudes"
3134 3206
			);
3135 3207

  
3136 3208
			$tempResult = $node->findnodes('./temporalCoverage');
3137
			if ( $tempResult->size > 1 ) {
3209
			if ( $tempResult->size() > 1 ) {
3138 3210
				errMoreThanOne("temporalCoverage");
3139 3211
			}
3140 3212
			else {
......
3171 3243
			}
3172 3244

  
3173 3245
			$tempResult = $node->findnodes('./geographicCoverage');
3174
			if ( $tempResult->size > 1 ) {
3246
			if ( $tempResult->size() > 1 ) {
3175 3247
				errMoreThanOne("geographicCoverage");
3176 3248
			}
3177 3249
			else {
......
3282 3354
	dontOccur( $doc, "./purpose",     "purpose" );
3283 3355
	dontOccur( $doc, "./maintenance", "maintnance" );
3284 3356

  
3285
	$results = $doc->findnodes('//dataset/contact/individualName');
3286
	if ( $results->size() > 1 ) {
3287
		errMoreThanOne("contact/individualName");
3288
	}
3289
	else {
3290
		foreach $node ( $results->get_nodelist ) {
3291
			dontOccur(
3292
				$node,
3293
				"../positionName|../onlineURL|../userId",
3294
				"positionName, onlineURL, userId in contact tag"
3295
			);
3296
			dontOccur( $node, "./saluation", "saluation in contact tag" );
3297

  
3298
			$tempResult = $node->findnodes(
3299
'../address|../phone|../electronicmailAddress|../organizationName'
3300
			);
3301
			if ( $tempResult->size > 0 ) {
3302
				$$templateVars{'origNamefirstContact'} =
3303
				  findValue( $node, 'givenName' );
3304
				$$templateVars{'origNamelastContact'} =
3305
				  findValue( $node, 'surName' );
3306

  
3307
				my $tempResult2 = $node->findnodes('../address');
3308
				if ( $tempResult2->size > 1 ) {
3309
					errMoreThanOne("address");
3310
				}
3311
				else {
3312
					foreach my $tempNode2 ( $tempResult2->get_nodelist ) {
3313
						$$templateVars{'origDeliveryContact'} =
3314
						  findValue( $tempNode2, 'deliveryPoint' );
3315
						$$templateVars{'origCityContact'} =
3316
						  findValue( $tempNode2, 'city' );
3317
						$$templateVars{'origStateContact'} =
3318
						  findValue( $tempNode2, 'administrativeArea' );
3319
						$$templateVars{'origZIPContact'} =
3320
						  findValue( $tempNode2, 'postalCode' );
3321
						$$templateVars{'origCountryContact'} =
3322
						  findValue( $tempNode2, 'country' );
3323
					}
3324
				}
3325

  
3326
				my $tempResult3 = $node->findnodes('../phone');
3327
				if ( $tempResult3->size > 2 ) {
3328
					errMoreThanN("phone");
3329
				}
3330
				else {
3331
					foreach my $tempNode2 ( $tempResult3->get_nodelist ) {
3332
						if ( $tempNode2->hasAttributes() ) {
3333
							my @attlist = $tempNode2->attributes();
3334
							if ( $attlist[0]->value eq "Fax" ) {
3335
								$$templateVars{'origFAXContact'} =
3336
								  $tempNode2->textContent();
3337
							}
3338
							else {
3339
								$$templateVars{'origPhoneContact'} =
3340
								  $tempNode2->textContent();
3341
							}
3342
						}
3343
						else {
3344
							$$templateVars{'origPhoneContact'} =
3345
							  $tempNode2->textContent();
3346
						}
3347
					}
3348
				}
3349
				$$templateVars{'origEmailContact'} =
3350
				  findValue( $node, '../electronicMailAddress' );
3351
				$$templateVars{'origNameOrgContact'} =
3352
				  findValue( $node, '../organizationName' );
3353
			}
3354
			else {
3355
				$$templateVars{'origNamefirstContact'} =
3356
				  findValue( $node, 'givenName' );
3357
				$$templateVars{'origNamelastContact'} =
3358
				  findValue( $node, 'surName' );
3359
				$$templateVars{'origNameOrgContact'} =
3360
				  findValue( $node, '../organizationName' );
3361
			}
3362
		}
3363
	}
3364

  
3365 3357
	$results =
3366 3358
	  $doc->findnodes('//dataset/methods/methodStep/description/section');
3367 3359
	debug( "Number methods: " . $results->size() );
......
3440 3432

  
3441 3433
	# Code for checking ACL: with EML 2.1, we should only look within the top-level elements
3442 3434
	#debug("checking user access");
3435
	
3436
	# deny rules have been discontinued in metacat, but we'll keep this in here
3443 3437
	dontOccur( $doc, "/eml:eml/access/deny", "access/deny" );
3444 3438

  
3445
	$results = $doc->findnodes('/eml:eml/access/allow');
3439
	#  check access from Metacat API instead of eml-embedded rules
3440
	my $docid   = $FORM::docid;
3441
	$results = getAllowAccess($docid);
3442
	# $results = $doc->findnodes('/eml:eml/access/allow');
3443
	
3446 3444
	my $accessError = 0;
3447 3445
	my $accessGranted = 0;
3448 3446
	my $docOwner;
......
3455 3453
	}
3456 3454
	push( @admins, $adminUsername );
3457 3455

  
3458
	#debug("getting user groups for current user");
3456
	debug("getting user groups for current user");
3459 3457

  
3460 3458
	my @userGroups = getUserGroups();
3461 3459

  
......
3480 3478
			$accessError = 1;
3481 3479
			debug($errorMessage);
3482 3480
		}
3483
		if (($principal eq $adminUsername) && ($permission ne 'all')) {
3484
			# If the principal is the admin and permission is not 'all' then this document
3485
	    	# could not have been created in the registry.
3486
			$errorMessage = "The ACL for this document has been changed outside the registry. Please use Morpho to edit this document (Access Error: admin principal cannot have $permission permission).\n";
3487
			$accessError = 1;
3488
			debug($errorMessage);
3489
		}
3481
		#if (($principal eq $adminUsername) && ($permission ne 'all' || $permission ne 'chmod' || $permission ne 'write')) {
3482
		#	# If the principal is the admin and permission is not 'all' then this document
3483
	    #	# could not have been created in the registry.
3484
		#	$errorMessage = "The ACL for this document has been changed outside the registry. Please use Morpho to edit this document (Access Error: admin principal cannot have $permission permission).\n";
3485
		#	$accessError = 1;
3486
		#	debug($errorMessage);
3487
		#}
3490 3488

  
3491 3489
		# no access error in doc, if principal is not equal to public and permission is
3492 3490
		# 'all' (requirements in registry) then try and determine if user has access
3493
		if (!$accessError && ($principal ne 'public') && ($permission eq 'all' || $permission eq 'write')) {
3491
		if (!$accessError && ($principal ne 'public') && ($permission eq 'all' || $permission eq 'write' || $permission eq 'chmod')) {
3494 3492
			my ($username, $password) = getCredentials();
3495 3493

  
3496 3494
			# 1) check if user matches principal
3497
			#debug("does user $username match principal $principal?");
3495
			debug("does user $username match principal $principal?");
3498 3496
			if ($principal eq $username) {
3499 3497
				$accessGranted = 1;
3500
				#debug("Access granted: user $username matches principal");
3498
				debug("Access granted: user $username matches principal");
3501 3499
			}
3502 3500

  
3503 3501
			# 2) if access not granted, check if user group matches principal
3504 3502
			if (!$accessGranted) {
3505
				#debug("is one of the user groups @userGroups the principal $principal?");
3503
				debug("is one of the user groups @userGroups the principal $principal?");
3506 3504
				for my $userGroup (@userGroups) {
3507
      				if ($userGroup == $principal) {
3508
           				$accessGranted = 1;
3509
           				#debug("Access granted: user group $userGroup matches principal");
3510
           				last;
3511
       				}
3505
					my $lowercaseUserGroup = lc $userGroup;
3506
					my $lowercasePrincipal = lc $principal;
3507
					if ($lowercaseUserGroup eq $lowercasePrincipal) {
3508
							$accessGranted = 1;
3509
							debug("Access granted: user group $userGroup matches principal");
3510
							last;
3511
					}
3512 3512
				}
3513 3513
			}
3514 3514
		}
......
3526 3526

  
3527 3527
		# 3) if access not granted, check if the user is a moderator or admin
3528 3528
		if (!$accessGranted) {
3529
			#debug("is user $username in admins @admins?");
3529
			debug("is user $username in admins @admins?");
3530 3530
			if (grep { $_ eq $username } @admins) {
3531 3531
				$accessGranted = 1;
3532 3532
				#debug("Access granted: user $username is an admin or moderator");
......
3535 3535

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff