package com.verisign.iot.discovery.utils; import com.verisign.iot.discovery.commons.Constants; import org.xbill.DNS.Name; import org.xbill.DNS.TextParseException; /** * Created by tjmurphy on 6/2/15. */ public class RDataUtil { /** * Extract the service-type dns-label prefix from a PTR record's rdata. If label is not found, return <code>null</code>. * @param rData * @return dnsLabel */ public static String getDnsLabelFromRData(String rData) { if(rData == null || rData.trim().isEmpty()){ throw new IllegalArgumentException( "rData cannot be null, empty, or blank" ); } if(rData.contains( Constants.LABEL )){ return rData.substring(0, rData.indexOf(Constants.LABEL)); } Name nameInRData = null; try{ nameInRData = new Name( rData.trim() ); } catch(TextParseException tpe){ throw new IllegalArgumentException( "rData must be valid domain name" ); } if(nameInRData.labels() < 2){ throw new IllegalArgumentException( "rData does not have enough labels to return dns label for a service type" ); } String transportProtocolLabel = nameInRData.getLabelString( 1 ); if(transportProtocolLabel.equals( Constants.TCP ) || transportProtocolLabel.equals( Constants.UDP )){ return nameInRData.getLabelString( 0 ) + Constants.DNS_LABEL_DELIMITER + transportProtocolLabel; } throw new IllegalArgumentException( "could not extract dns label from rData" ); } public static String getServiceTypeNameFromRData(String rData) { if(rData == null || rData.trim().isEmpty()){ throw new IllegalArgumentException( "rData cannot be null, empty, or blank" ); } if(rData.contains( Constants.NAME )){ String serviceTypeName = rData.substring(0, rData.indexOf(Constants.NAME)).trim(); if(!serviceTypeName.isEmpty()){ return serviceTypeName; } } throw new IllegalArgumentException( "could not extract service type name from rData" ); } }