Oi gente,
me deparei com o problema mais insolúvel que já vi na vida até agora.
Eu criei um parser para transformar xml em json e exportar isso pro couchdb. O programa aparentemente funciona direitinho, mas quando vamos recuperar os dados do valor importado no couch ele retorna null. Sendo que no futon ele enxerga todos os dados importados!!!
@.@
Eis o código do parser xml to json
[code]private Object parseIt(Object mOrL) {
StringBuilder oldString = new StringBuilder(“a”);
int i = 0;
int j = 0;
long countTags = 0;
do {
oldString.delete(0, oldString.length());
oldString.append(this.s.toString());
while (s.length() > 0 && s.charAt(0)=='\t') s = s.deleteCharAt(0);
while (s.length() > 0 && s.charAt(0)==' ') s = s.deleteCharAt(0);
parseamento:
{
Pattern endTag = Pattern.compile("</.+?>");
Matcher et = endTag.matcher(s);
boolean etFind = et.find();
String etGroup0 = etFind ? et.group(0) : "";
boolean ctEmpty = this.closeTag.empty();
String closeTagPeek = ctEmpty ? "" : "</" + this.closeTag.peek().toString() + ">";
closeTagPeek = closeTagPeek.replaceAll(" ", "");
boolean equals = ctEmpty ? false : etGroup0.equals(closeTagPeek);
boolean startsWith = s.indexOf("</") ==0;
if (!ctEmpty && etFind && equals && startsWith) {
this.closeTag.pop();
s = s.replace(et.start(0), et.end(0), "");
while (s.length() > 0 && s.charAt(0)=='\t') s = s.deleteCharAt(0);
if (textInContent == false) {
return mOrL instanceof Map ? (Map<String, Object>) mOrL : (ArrayList<Map<String, Object>>) mOrL;
}
textInContent = false;
} else if (!ctEmpty && etFind && !equals && startsWith) {
controlador.printOnLog("Erro de sintaxe "
+ "no xml. Por favor,\n passe-o em um validador"
+ "\n a tag " + et.group(0) + " está fechando uma tag que não foi aberta"
+ "\nSe o SAFEMODE estiver habilitado a compilação vai "
+ "\nparar por causa desse erro"
+ "\nArquivo:" + actualFile
+ "\nTag nº:" + String.valueOf(countTags));
if (controlador.safeMode()) {
controlador.printOnLog("A compilação parou");
throw new IllegalArgumentException();
}
controlador.printOnLog("tag não compilada:" + et.group());
s = s.replace(et.start(0), et.end(0), "");
}
Pattern tagAberta = Pattern.compile("<.+?[^/]>");
Pattern tagFechada = Pattern.compile("<.+?[^<]/>");
Pattern notTag = Pattern.compile("<[A-Za-z0-9_]+>");
Matcher tA = tagAberta.matcher(s);
Matcher tF = tagFechada.matcher(s);
Matcher nT = notTag.matcher(s);
boolean tAfind = tA.find();
boolean tFfind = tF.find();
boolean nTfind = nT.find();
int nTend = nTfind ? nT.end() : 0;
int nTstart = nTfind ? nT.start() : 0;
primeirasTags:
if ((tAfind && tFfind && !nTfind)
|| (tAfind && tFfind && nTfind && nTstart != 0)) {
countTags++;
String aux = "";
int tAEnd = tAfind ? tA.end() : 0;
int tFEnd = tFfind ? tF.end() : 0;
Pattern tag;
Matcher t;
if ((tAfind && !tFfind)
|| (tAfind && tFfind && tAEnd < tFEnd)) {
if (nTfind && nTend < tAEnd) {
break primeirasTags;
}
aux = tA.group(0);
tag = Pattern.compile("<.+? ");
t = tag.matcher(aux);
if (!t.find()) {
break primeirasTags;
}
s = s.replace(tA.start(0), tA.end(0), "");
} else if ((!tAfind && tFfind)
|| (tAfind && tFfind && tAEnd > tFEnd)) {
if (nTfind && nTend < tFEnd) {
break primeirasTags;
}
aux = tF.group(0);
tag = Pattern.compile("<.+? ");
t = tag.matcher(aux);
if (!t.find()) {
break primeirasTags;
}
s = s.replace(tF.start(0), tF.end(0), "");
} else {
controlador.printOnLog("Erro interno desconhecido. "
+ "Xingue o programador"
+ "\nArquivo:" + actualFile
+ "Tag nº:" + String.valueOf(countTags));
throw new IllegalArgumentException();
}
aux = t.replaceFirst("");
Pattern pairs = Pattern.compile(".+?=\".*?\"");
Matcher p = pairs.matcher(aux);
Map<String, Object> allP = new HashMap<String, Object>();
while (p.find()) {
Pattern vv = Pattern.compile(".+?=\"\"");
Matcher m = vv.matcher(p.group());
Pattern k = Pattern.compile(".+?=");
Matcher n = k.matcher(p.group());
n.find();
if (m.find() && !n.find()) {
String key = m.group();
while (key.startsWith(" ")) key = key.replaceFirst(" ", "");
key = key.substring(0, key.length() - 3);
aux = p.replaceFirst("");
p = pairs.matcher(aux);
while (key.startsWith(" ")) key = key.replaceFirst(" ", "");
allP.put(key, "");
} else {
String key = n.group();
while (key.startsWith(" ")) key = key.replaceFirst(" ", "");
key = key.substring(0, key.length() - 1);
aux = p.replaceFirst("");
p = pairs.matcher(aux);
String value = n.replaceFirst("");
value = value.substring(1, value.length() - 1);
while (key.startsWith(" ")) {
key = key.replaceFirst(" ", "");
}
allP.put(key, value);
}
}
if (!aux.endsWith("/>")) {
closeTag.push(t.group().substring(1, t.group().length()));
this.key = t.group().substring(1, t.group().length());
while (key.endsWith(" ")) key = key.replaceFirst(" ", "");
allP.put(key,(HashMap<String, Object>) this.parseIt(new HashMap<String, Object>()));
}
if (mOrL instanceof Map) {
((Map<String, Object>) mOrL).put(t.group().substring(1, t.group().length()), allP);
} else {
Map<String, Object> hm = new HashMap<String, Object>();
hm.put(t.group().substring(1, t.group().length()), allP);
((ArrayList<Map<String, Object>>) mOrL).add(hm);
}
this.key = t.group().substring(1, t.group().length());
while (key.endsWith(" ")) key = key.replaceFirst(" ", "");
break parseamento;
}
nT = notTag.matcher(s);
if (nT.find() && nT.start() == 0) {
countTags++;
Pattern tag = Pattern.compile("<.+?>");
Matcher t = tag.matcher(nT.group(0));
if (!t.find()) {
controlador.printOnLog("Erro de sintaxe "
+ "no xml. Por favor,\n passe-o em um validador"
+ "\nArquivo:" + actualFile
+ "Tag nº:" + String.valueOf(countTags));
throw new IllegalArgumentException();
}
t = tag.matcher(s);
if (!t.find())break parseamento;
key = t.group(0).substring(1, t.group(0).length() - 1);
s = s.replace(t.start(0), t.end(0), "");
closeTag.push(key);
boolean vdd = true;
while (vdd) {
vdd = false;
while (s.length() > 0 && s.charAt(0)=='\n') { s = s.deleteCharAt(0); vdd = true; }
while (s.length() > 0 && s.charAt(0)==' ') { s = s.deleteCharAt(0); vdd = true; }
while (s.length() > 0 && s.charAt(0)=='\t') { s = s.deleteCharAt(0); vdd = true; }
}
if (s.charAt(0)=='<') {
if (mOrL instanceof Map) {
((Map<String, Object>) mOrL).put(key, this.parseIt(new ArrayList<Map<String, Object>>()));
} else {
Map<String, Object> hm = new HashMap<String, Object>();
hm.put(key, this.parseIt(new ArrayList<Map<String, Object>>()));
((ArrayList<Map<String, Object>>) mOrL).add(hm);
}
} else {
Pattern textFirst = Pattern.compile(".*?</");
Matcher textf = textFirst.matcher(s);
if (!textf.find()) break parseamento;
String value = textf.group(0).substring(0, textf.group(0).length() - 2);
s = s.replace(textf.start(0), textf.end(0), "");
s.insert(0, "</");
if (mOrL instanceof Map) {
((Map<String, Object>) mOrL).put(key, value);
} else {
Map<String, Object> hm = new HashMap<String, Object>();
hm.put(key, value);
((ArrayList<Map<String, Object>>) mOrL).add(hm);
}
textInContent = true;
}
}
if (i == 4 && s.length() > 3 && j < 5) {
i = 0;
j++;
while (s.length() > 0 && s.charAt(0)=='\t') s = s.deleteCharAt(0);
while (s.length() > 0 && s.charAt(0)==' ') s = s.deleteCharAt(0);
Pattern textFirst = Pattern.compile(".*?</");
Matcher textf = textFirst.matcher(s);
if (!textf.find()) break parseamento;
String value = textf.group(0).substring(0, textf.group(0).length() - 2);
s = s.replace(textf.start(0), textf.end(0), "");
s.insert(0, "</");
if (mOrL instanceof Map) {
((Map<String, Object>) mOrL).put(key, value);
} else {
Map<String, Object> hm = new HashMap<String, Object>();
hm.put(key, value);
((ArrayList<Map<String, Object>>) mOrL).add(hm);
}
textInContent = true;
}
}
i = oldString.toString().equalsIgnoreCase(s.toString()) ? i + 1 : 0;
} while (i < 5);
if (this.controlador.isGc()) System.gc();
return mOrL instanceof Map ? (Map<String, Object>) mOrL : (ArrayList<Map<String, Object>>) mOrL;
}[/code]
Eis o código do método que envia ao couchdb
[code]public void toCouch() {
if (!this.xmlToolJsonView.getBusyInconTimer().isRunning()) {
this.xmlToolJsonView.getBusyInconTimer().start();
}
Database db;
if (!this.xmlToolJsonView.getPortjTextField1().getText().isEmpty()) {
db = new Database(this.xmlToolJsonView.getHostjTextField3().getText(), Integer.parseInt(this.xmlToolJsonView.getPortjTextField1().getText()), this.xmlToolJsonView.getDatabasejTextField2().getText());
} else {
db = new Database(this.xmlToolJsonView.getHostjTextField3().getText(),
this.xmlToolJsonView.getDatabasejTextField2().getText());
}
if (!this.xmlToolJsonView.getUserjTextField4().getText().isEmpty()) {
db.getServer().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(splitTag, splitTag));
}
if (map instanceof ArrayList) {
for (int i = 0; i < map.size(); i++) {
db.createDocument(map.get(i));
}
} else {
map = this.runParser();
}
if (!this.xmlToolJsonView.getBusyInconTimer().isRunning()) {
this.xmlToolJsonView.getBusyInconTimer().start();
}
if (map == null) {
this.printOnLog("Erros ocorreram, o xml não foi parseado."
+ "Verifique seus passos. Verifique também a sintaxe do xml");
} else {
for (int i = 0; i < map.size(); i++) {
db.createDocument(map.get(i));
}
}
if (this.xmlToolJsonView.getBusyInconTimer().isRunning()) {
this.xmlToolJsonView.getBusyInconTimer().stop();
}
}[/code]
Eis as fotos de como os dados aparecem no couch
Isso é muito estranho… olhando as duas figuras em anexo, sabemos que ele deveria retornar o valor de “unidade” com os dados que estão contidos nela, e não um campo null…
Isso é extremamente difícil de resovler…
se alguém puder me ajudar, ou ao menos indicar alguma referência onde eu possa me esclarecer sobre este tipo de fenômeno, fico eternamente agradecido!!