Problema com mascara

Boa tarde, outro dia precisei trabalhar com mascara e encontrei esta classe.

public class MaskFormat{

	private static final long serialVersionUID = 1L;
	private String vMask;
	private String vValue;
	

	public static String getValueMaskFormat(String pMask, String pValue){
		/* 
		 * Substituir as mascaras passadas como  9, X por # para efetuar a formatcao
		 */
		pMask = pMask.replaceAll("1", "#");
		pMask = pMask.replaceAll("2", "#");
		pMask = pMask.replaceAll("3", "#");
		pMask = pMask.replaceAll("4", "#");
		pMask = pMask.replaceAll("5", "#");
		pMask = pMask.replaceAll("6", "#");
		pMask = pMask.replaceAll("7", "#");
		pMask = pMask.replaceAll("8", "#");
		pMask = pMask.replaceAll("9", "#");
		pMask = pMask.replaceAll("0", "#");
		pMask = pMask.toUpperCase().replaceAll("X", "#");

		/* 
		 * Formata valor com a mascara passada  
		 */
		System.out.println("pMask: " + pMask + " pValue: " + pValue);
		for (int i = 0; i < pValue.length(); i++) {
			// if (pValue.substring(i, i + 1).equals(".")) {
			// continue;
			// }
			pMask = pMask.replaceFirst("#", pValue.substring(i, i + 1));
			System.out.println(pMask);
		}
		int posicao = pMask.indexOf("#");
		if (posicao > 0) {
			pMask = pMask.substring(0, posicao - 1);
		}
		
		/* 
		 * Subistitui por string vazia os digitos restantes da mascara 
		 * quando o valor passado é menor que a mascara   
		 */
		return pMask.replaceAll("#", "");
	}

	public String getValueMaskFormat(){
		return getValueMaskFormat(getMask(), getValue());
	}

	public String getMask(){
		return vMask;
	}

	public void setMask(String mask){
		vMask = mask;
	}

	public String getValue(){
		return vValue;
	}

	public void setValue(String value){
		vValue = value;
	}
	
}

Só que não esta fazendo corretamente.
Ex.

	public static void main(String[] args) {
		MaskFormat.getValueMaskFormat("9.9.99.999.999", "3.1.02.010.04");

	}

a saida é

pMask: #.#.##.###.### pValue: 3.1.02.010.04 3.#.##.###.### 3...##.###.### 3...1#.###.### 3...1..###.### 3...1..0##.### 3...1..02#.### 3...1..02..### 3...1..02..0## 3...1..02..01# 3...1..02..010 3...1..02..010 3...1..02..010 3...1..02..010

Alguem saberia como corrigir ou algo que faça corretamente?

Brother,

O trecho que fazia o tratamento do caractere “.” está comentada.
Sem esse tratamento, ele está substituindo os “.” que encontra em pValue lugar correspondente em pMask.

for (int i = 0; i < pValue.length(); i++) { // if (pValue.substring(i, i + 1).equals(".")) { // continue; // } pMask = pMask.replaceFirst("#", pValue.substring(i, i + 1)); System.out.println(pMask); }

A parte comentada foi um teste, quando tiro comentário, ele não completa a máscara.
A saída fica assim:

3.1.02.010.04#

Fiz essa gambiarra, mas para o que preciso está funcionando direitinho.
Mas se aparecer alguém com uma forma mais elegante fico agradecido.

	public static String formatString(String string, String mask) throws java.text.ParseException {
		javax.swing.text.MaskFormatter mf = new javax.swing.text.MaskFormatter(mask);
		mf.setValueContainsLiteralCharacters(false);
		return mf.valueToString(string);
	}

	public static String retornaFormatado(String string, String mask) throws ParseException {
		String[] mascara = mask.split(&quot;\\.&quot;);
		String[] texto = string.split(&quot;\\.&quot;);
		StringBuilder retorno = new StringBuilder();
		for (int i = 0; i &lt; texto.length; i++) {
			retorno.append(completeToLeft(texto[i], '0', mascara[i].length()));
		}
		return formatString(retorno.toString(), mask);
	}
	
	
	public static String completeToLeft(String value, char c, int size) {
		String result = value;
		while (result.length() &lt; size) {
			result = c + result;
		}
		return result;
	}
public static void main(String[] args) {
System.out.println(retornaFormatado(&quot;3.1.02.010.04&quot;, &quot;#.#.##.###.###&quot;));
}
}