package org.ovirt.engine.core.common.validation; import org.ovirt.engine.core.common.utils.IPAddressConverter; import org.ovirt.engine.core.common.utils.IPv4AddressConverter; import org.ovirt.engine.core.common.utils.ValidationUtils; public class MaskValidator { private IPAddressConverter ipAddressConverter = IPv4AddressConverter.getInstance(); private static MaskValidator INSTANCE = new MaskValidator(); private MaskValidator() { } public static MaskValidator getInstance() { return INSTANCE; } /*** * Check if mask is in IPv4 format: x.x.x.x where: * <ul> * <li>x belongs to [0,255] * </ul> * <p> * <b>Note!</b> the function is not validating that mask value is valid, please see @see * {@link MaskValidator#isNetmaskValid(String)} (String)} * * @return true if correct IPv4 format , false otherwise. */ public boolean isValidNetmaskFormat(String mask) { return mask != null && mask.matches("^" + ValidationUtils.IPV4_PATTERN_NON_EMPTY + "$"); } /*** * Check if mask is a string [0-32] (possible with / prefix) * * @return true if a string [0-32] (possible with /) which represent a valid prefix, false otherwise. */ public boolean isPrefixValid(String mask) { return mask != null && mask.matches("^/?" + ValidationUtils.SUBNET_PREFIX_PATTERN + "$"); } /*** * check if mask is valid and netmasked formated and return true if does * * @param netmask in valid format , please verify first with @see {@link MaskValidator#isValidNetmaskFormat(String)} * @return true if the netmask is in IPv4 format and valid, false otherwise */ public boolean isNetmaskValid(String netmask) { long addressInBits = ipAddressConverter.convertIpAddressToLong(netmask); long mask = 1; boolean isFirstOneFound = false; for (int i = 0; i < 32; i++) { if (isFirstOneFound && (mask & addressInBits) != 1) { return false; } if ((mask & addressInBits) == 1) { isFirstOneFound = true; } addressInBits >>= 1; } return true; } }