docs: private InterestRateSwapLegProductDescriptor getSwapLegProductDescriptor(Element leg) {
  
  		//is this a fixed rate leg?
  		boolean isFixed = leg.getElementsByTagName("calculationPeriodDates").item(0).getAttributes().getNamedItem("id").getTextContent().equalsIgnoreCase("fixedCalcPeriodDates");
  
  		//get start and end dates of contract
  		LocalDate startDate		= LocalDate.parse(((Element) leg.getElementsByTagName("effectiveDate").item(0)).getElementsByTagName("unadjustedDate").item(0).getTextContent());
  		LocalDate maturityDate	= LocalDate.parse(((Element) leg.getElementsByTagName("terminationDate").item(0)).getElementsByTagName("unadjustedDate").item(0).getTextContent());
  
  		//determine fixing/payment offset if available
  		int fixingOffsetDays = 0;
  		if(leg.getElementsByTagName("fixingDates").getLength() > 0) {
  			fixingOffsetDays = Integer.parseInt(((Element) leg.getElementsByTagName("fixingDates").item(0)).getElementsByTagName("periodMultiplier").item(0).getTextContent());
  		}
  		int paymentOffsetDays = 0;
  		if(leg.getElementsByTagName("paymentDaysOffset").getLength() > 0) {
  			paymentOffsetDays = Integer.parseInt(((Element) leg.getElementsByTagName("paymentDaysOffset").item(0)).getElementsByTagName("periodMultiplier").item(0).getTextContent());
  		}
  
  		//Crop xml date roll convention to match internal format
  		String xmlInput = ((Element) leg.getElementsByTagName("calculationPeriodDatesAdjustments").item(0)).getElementsByTagName("businessDayConvention").item(0).getTextContent();
  		xmlInput = xmlInput.replaceAll("ING", "");
  		DateRollConvention dateRollConvention = DateRollConvention.getEnum(xmlInput);
  
  		//get daycount convention
  		DaycountConvention daycountConvention = DaycountConvention.getEnum(leg.getElementsByTagName("dayCountFraction").item(0).getTextContent());
  
  		//get trade frequency
  		Frequency frequency = null;
  		Element calcNode = (Element) leg.getElementsByTagName("calculationPeriodFrequency").item(0);
  		int multiplier = Integer.parseInt(calcNode.getElementsByTagName("periodMultiplier").item(0).getTextContent());
  		switch(calcNode.getElementsByTagName("period").item(0).getTextContent().toUpperCase()) {
  		case "D" : if(multiplier == 1) {frequency = Frequency.DAILY;} break;
  		case "Y" : if(multiplier == 1) {frequency = Frequency.ANNUAL;} break;
  		case "M" : switch(multiplier) {
  		case 1 : frequency = Frequency.MONTHLY;
  		case 3 : frequency = Frequency.QUARTERLY;
  		case 6 : frequency = Frequency.SEMIANNUAL;
  		}
  		}
  
  		//build schedule
  		ScheduleDescriptor schedule = new ScheduleDescriptor(startDate, maturityDate, frequency, daycountConvention, shortPeriodConvention,
  				dateRollConvention, abstractBusinessdayCalendar, fixingOffsetDays, paymentOffsetDays);
  
  		// get notional
  		double notional = Double.parseDouble(((Element) leg.getElementsByTagName("notionalSchedule").item(0)).getElementsByTagName("initialValue").item(0).getTextContent());
  
  		// get fixed rate and forward curve if applicable
  		double spread = 0;
  		String forwardCurveName = "";
  		if(isFixed) {
  			spread = Double.parseDouble(((Element) leg.getElementsByTagName("fixedRateSchedule").item(0)).getElementsByTagName("initialValue").item(0).getTextContent());
  		} else {
  			forwardCurveName = leg.getElementsByTagName("floatingRateIndex").item(0).getTextContent();
  		}
  
  		return new InterestRateSwapLegProductDescriptor(forwardCurveName, discountCurveName, schedule, notional, spread, false);
  	}