Preprocessor { {{ private static String processedContent = ""; }} public static String preProcessSchemaDefinition(BufferedReader reader) throws IOException {{ String content = ""; // First, just read the contents of the file into a string for (String line = reader.readLine(); line != null; line = reader.readLine()) { content = content + line + "\n"; } // Extract the Schema name space prefix from the contents; to do that, // first skip over the "" tag at the beginning of the // document String searchSpace = content; int startIndex = content.indexOf("= 0) { int endIndex = content.indexOf("?>", startIndex+3); if (endIndex > startIndex) searchSpace = content.substring(endIndex+2); } String nsPrefix = ""; try { StringTokenizer st = new StringTokenizer(searchSpace, "<>: \t\n"); nsPrefix = st.nextToken(); if (nsPrefix.equals("schema")) nsPrefix = ""; else nsPrefix = nsPrefix + ":"; } catch (NoSuchElementException e) {} // Convert all "comments" to strings to enable parsing them as such content = stringifyComments(content); // Convert contents of non-empty documentation elements to strings content = stringifyCharContent(content, nsPrefix, "documentation"); // Insert the space character needed in the start tag (between the tag // name and the ">" character) for all elements that can have both empty // and non-empty contents, and has a non-empty content with no // attributes in this instance. This is needed for correct parsing. content = addSpaceAfterStartTag(content, nsPrefix, "all"); content = addSpaceAfterStartTag(content, nsPrefix, "any"); content = addSpaceAfterStartTag(content, nsPrefix, "choice"); content = addSpaceAfterStartTag(content, nsPrefix, "complexContent"); content = addSpaceAfterStartTag(content, nsPrefix, "complexType"); content = addSpaceAfterStartTag(content, nsPrefix, "documentation"); content = addSpaceAfterStartTag(content, nsPrefix, "duration"); content = addSpaceAfterStartTag(content, nsPrefix, "encoding"); content = addSpaceAfterStartTag(content, nsPrefix, "field"); content = addSpaceAfterStartTag(content, nsPrefix, "fractionDigits"); content = addSpaceAfterStartTag(content, nsPrefix, "list"); content = addSpaceAfterStartTag(content, nsPrefix, "notation"); content = addSpaceAfterStartTag(content, nsPrefix, "pattern"); content = addSpaceAfterStartTag(content, nsPrefix, "period"); content = addSpaceAfterStartTag(content, nsPrefix, "restriction"); content = addSpaceAfterStartTag(content, nsPrefix, "selector"); content = addSpaceAfterStartTag(content, nsPrefix, "sequence"); content = addSpaceAfterStartTag(content, nsPrefix, "simpleContent"); content = addSpaceAfterStartTag(content, nsPrefix, "simpleType"); content = addSpaceAfterStartTag(content, nsPrefix, "totalDigits"); content = addSpaceAfterStartTag(content, nsPrefix, "union"); // Replace the "\" in escape sequences contained in patterns by "$" // because the Demeterj-generated parser doesn't like it content = replacePattern(content, "\\d", "$d"); content = replacePattern(content, "\\p", "$p"); content = replacePattern(content, "\\P", "$P"); content = replacePattern(content, "\\s", "$s"); content = replacePattern(content, "\\w", "$w"); // All pre-processing done if (! processedContent.equals("")) processedContent = processedContent + "\n"; processedContent = processedContent + "===============================\n" + "Start of schema-definition file\n" + "===============================\n" + content + "=============================\n" + "End of schema-definition file\n" + "=============================\n"; return content; }} public static String saveSchemaInFile() {{ String returnValue = ""; // Open the output file for writing try { String filename = "pp_schema"; BufferedWriter file = new BufferedWriter(new FileWriter(filename)); file.write(processedContent); file.close(); returnValue = filename; } catch (IOException e) {} return returnValue; }} private static String stringifyComments(String input) {{ String output = input; int startIndex = 0; for (int startTagIndex = output.indexOf("", startTagIndex+4); if (endTagIndex > startTagIndex) { int contentStartIndex = startTagIndex + 4; String content = output.substring(contentStartIndex, endTagIndex); content = " \"" + combineWhiteSpace(content) + "\" "; output = output.substring(0, contentStartIndex) + content + output.substring(endTagIndex); startIndex = contentStartIndex + content.length() + 3; } } return output; }} private static String stringifyCharContent(String input, String nsPrefix, String tag) {{ String startTagPattern = "<" + nsPrefix + tag; String endTagPattern = ""; String output = input; int startIndex = 0; for (int startTagIndex = output.indexOf(startTagPattern, startIndex); startTagIndex >= 0; startTagIndex = output.indexOf(startTagPattern, startIndex)) { int endTagIndex = output.indexOf(endTagPattern, startTagIndex+startTagPattern.length()); if (endTagIndex > startTagIndex) { int contentStartIndex = 1 + output.indexOf(">", startTagIndex+startTagPattern.length()); String content = output.substring(contentStartIndex, endTagIndex); content = " \"" + combineWhiteSpace(content) + "\" "; output = output.substring(0, contentStartIndex) + content + output.substring(endTagIndex); startIndex = contentStartIndex + content.length() + endTagPattern.length(); } } return output; }} private static String addSpaceAfterStartTag(String input, String nsPrefix, String tag) {{ return replacePattern(input, "<" + nsPrefix + tag + ">", "<" + nsPrefix + tag + " >"); }} private static String replacePattern(String input, String oldContent, String newContent) {{ String output = input; int startIndex = 0; for (int index = output.indexOf(oldContent, startIndex); index >= 0; index = output.indexOf(oldContent, startIndex)) { startIndex = index + newContent.length(); output = output.substring(0, index) + newContent + output.substring(index + oldContent.length()); } return output; }} private static String combineWhiteSpace(String input) {{ String output = ""; for (StringTokenizer st = new StringTokenizer(input, "\r\n\t "); st.hasMoreTokens(); ) { output = output + (output.equals("") ? "" : " ") + st.nextToken(); } return output; }} }