//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.publishing.services.index; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.Locale; import java.util.Vector; import com.ibm.icu.util.StringTokenizer; class KeyWordHolder { private static final String lang = Locale.getDefault().getLanguage(); private Vector keyWordFiles = null; private Vector keyWords = null; KeyWordHolder() { keyWordFiles = new Vector(); } void add(KeyWordFile key) { keyWordFiles.addElement(key); } void divide() { if (keyWordFiles != null) { for (int i = 0; i < keyWordFiles.size(); i++) { String nextKeyWord = ""; //$NON-NLS-1$ KeyWordFile tmp = (KeyWordFile) keyWordFiles.elementAt(i); while (nextKeyWord != null) { nextKeyWord = null; KeyWordDef def = tmp.getNextKeyWord(); if (def != null) { nextKeyWord = def.toString(); } if (nextKeyWord != null) { int noOfDoc = 1; Document tmpD = tmp.getDocument(nextKeyWord, noOfDoc); while (tmpD != null) { int index = MiscStatic .getIndex( nextKeyWord, KeyWordIndexHelper.defObj.levelSeparatorReplace, 0); if (index == -1) { index = nextKeyWord.length(); } KeyWord tmpK = createKeyWord(def); if (tmpK != null && tmpD != null) { tmpK.addKeyWord(def, nextKeyWord, tmpD); } noOfDoc++; tmpD = tmp.getDocument(nextKeyWord, noOfDoc); } } } } } } private KeyWord createKeyWord(KeyWordDef def) { if (keyWords == null) { keyWords = new Vector(); KeyWord newKeyWord = new KeyWord(def); keyWords.addElement(newKeyWord); return newKeyWord; } else { int index = -1; int i = 0; KeyWord newKeyWord2 = new KeyWord(def); String str2 = newKeyWord2.getKeyWord(); while (index == -1 && i < keyWords.size()) { KeyWord tmpK = (KeyWord) keyWords.elementAt(i); String str = tmpK.getKeyWord(); int cmp = str2.toUpperCase().compareTo(str.toUpperCase()); if (cmp < 0) { index = i; } else if (cmp == 0) { int cmp2 = str2.compareTo(str); if (cmp2 != 0) { // this is wrong, will put the entry to the previous item // if (cmp2 > 0) { // index = i; // } else { // index = i - 1; // } if (cmp2 < 0) { index = i; } } else { return tmpK; } } i++; } if (index == -1) { index = keyWords.size(); } keyWords.insertElementAt(newKeyWord2, index); return newKeyWord2; } } void readSpecKeyWords(StringTokenizer parser) { while (parser.hasMoreTokens()) { String specKeyWordString = parser.nextToken().trim(); String relatedKeyWord = parser.nextToken().trim(); KeyWordDef specKeyDef = new KeyWordDef(specKeyWordString); KeyWordDef relatedKeyDef = new KeyWordDef(relatedKeyWord); specKeyWordString = specKeyDef.toString(); relatedKeyWord = relatedKeyWord.toString(); if (specKeyWordString != null && relatedKeyWord != null && relatedKeyWordExists(specKeyWordString, relatedKeyWord)) { boolean found = false; int i = 0; String firstKeyWord = specKeyWordString; int pos = specKeyWordString.indexOf( KeyWordIndexHelper.defObj.levelSeparatorReplace, 0); if (pos != -1) { firstKeyWord = specKeyWordString.substring(0, pos); } IO.printDebug("firstKeyWord " + firstKeyWord); //$NON-NLS-1$ while (!found && i < keyWords.size()) { IO.printDebug("holder in first while " + i); //$NON-NLS-1$ KeyWord tmpK = (KeyWord) keyWords.elementAt(i); if (firstKeyWord.equals(tmpK.getKeyWord())) { found = true; if (pos != -1) { tmpK.insertSpecKeyWord(specKeyWordString .substring(pos + 1), relatedKeyWord); } else { tmpK.setSpecKeyWord(relatedKeyWord, false); } } i++; } if (!found) { IO.printDebug("!found"); //$NON-NLS-1$ int index = -1; i = 0; KeyWord newKeyWord2 = new KeyWord(specKeyDef); if (pos == -1) { newKeyWord2.setSpecKeyWord(relatedKeyWord, true); } else { newKeyWord2.insertSpecKeyWord(specKeyWordString .substring(pos + 1), relatedKeyWord); } while (index == -1 && i < keyWords.size()) { IO.printDebug("holder in second while " + i); //$NON-NLS-1$ KeyWord tmpK = (KeyWord) keyWords.elementAt(i); if (newKeyWord2.getKeyWord().toUpperCase().compareTo( tmpK.getKeyWord().toUpperCase()) < 0) { index = i; } else if (newKeyWord2.getKeyWord().toUpperCase() .compareTo(tmpK.getKeyWord().toUpperCase()) == 0) { if (newKeyWord2.getKeyWord().compareTo( tmpK.getKeyWord()) != 0) { if (newKeyWord2.getKeyWord().compareTo( tmpK.getKeyWord()) > 0) { index = i; } else { index = i - 1; } } } i++; } if (index != -1) { keyWords.insertElementAt(newKeyWord2, index); } else { keyWords.insertElementAt(newKeyWord2, keyWords.size()); } } } } } private boolean relatedKeyWordExists(String specKeyWordString, String relatedKeyWord) { if (keyWords != null) { int i = 0; while (i < keyWords.size()) { KeyWord tmpK = (KeyWord) keyWords.elementAt(i); if (tmpK.getKeyWord().equals(relatedKeyWord)) { return true; } i++; } } System.err.println(relatedKeyWord + HelpMessages.RELATED_KEYWORD_NOT_FOUND + specKeyWordString); return false; } void print() { if (KeyWordIndexHelper.defObj.getIndexResultFile() != null) { printFrameset(); printIndex(); } printKeyWords(); } // Prints the htmlfile containing the frameset private void printFrameset() { try { File file = new File(KeyWordIndexHelper.defObj.getWwwRoot() + KeyWordIndexHelper.defObj.getMainResultFile()); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } OutputStreamWriter outP; if (KeyWordIndexHelper.defObj.getCharacterSet() != null) { outP = new OutputStreamWriter(new FileOutputStream(file), KeyWordIndexHelper.defObj.getCharacterSet()); } else { outP = new OutputStreamWriter(new FileOutputStream(file)); } System.out.println(HelpMessages.WRITE_FILE + KeyWordIndexHelper.defObj.getWwwRoot() + "" + KeyWordIndexHelper.defObj.getMainResultFile()); //$NON-NLS-1$ //MiscStatic.print(outP, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); //$NON-NLS-1$ MiscStatic.print(outP, "<html lang=\"" + lang + "\" xml:lang=\"" + lang + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ MiscStatic.print(outP, "<head>\n"); //$NON-NLS-1$ MiscStatic .print(outP, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); //$NON-NLS-1$ MiscStatic .print( outP, "<title>" + KeyWordIndexHelper.defObj.getIndexTitle() + "</title>\n"); //$NON-NLS-1$ //$NON-NLS-2$ MiscStatic.print(outP, "</head>\n"); //$NON-NLS-1$ File keyWordsFile = new File(KeyWordIndexHelper.defObj.getWwwRoot() + KeyWordIndexHelper.defObj.getKeywordResultFile()); String keyWordPath = KeyWordIndexHelper.defObj.getRelativePath() + KeyWordIndexHelper.defObj.getKeywordResultFile(); File indxeFile = new File(KeyWordIndexHelper.defObj.getWwwRoot() + KeyWordIndexHelper.defObj.getIndexResultFile()); String indexPath = KeyWordIndexHelper.defObj.getRelativePath() + KeyWordIndexHelper.defObj.getIndexResultFile(); MiscStatic .print( outP, "<frameset rows=\"" + KeyWordIndexHelper.defObj.getIndexHeight() + ",*\">\n"); //$NON-NLS-1$ //$NON-NLS-2$ MiscStatic .print( outP, "<frame name=\"" + KeyWordIndexHelper.defObj.getIndexTarget() //$NON-NLS-1$ + "\" title=\"Navigation bar\" src=\"" + indexPath //$NON-NLS-1$ + "\" marginheight=\"2\" marginwidth=\"2\" scrolling=\"auto\">\n"); //$NON-NLS-1$ MiscStatic .print( outP, "<frame name=\"" + KeyWordIndexHelper.defObj.getKeyWordTarget() //$NON-NLS-1$ + "\" title=\"Contents\" src=\"" + keyWordPath //$NON-NLS-1$ + "\" marginheight=\"0\" marginwidth=\"2\" scrolling=\"auto\">\n"); //$NON-NLS-1$ MiscStatic.print(outP, "</frameset>\n"); //$NON-NLS-1$ MiscStatic.print(outP, "</html>"); //$NON-NLS-1$ outP.close(); } catch (Exception e) { System.err .println("KeyWordHolder:printFrameset\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$ } } // Prints the html file with the shortcuts to each anchor in the keywordfile private void printIndex() { try { File file = new File(KeyWordIndexHelper.defObj.getWwwRoot() + KeyWordIndexHelper.defObj.getIndexResultFile()); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } OutputStreamWriter outP; if (KeyWordIndexHelper.defObj.getCharacterSet() != null) { outP = new OutputStreamWriter(new FileOutputStream(file), KeyWordIndexHelper.defObj.getCharacterSet()); } else { outP = new OutputStreamWriter(new FileOutputStream(file)); } System.out.println(HelpMessages.WRITE_FILE + KeyWordIndexHelper.defObj.getWwwRoot() + "" + KeyWordIndexHelper.defObj.getIndexResultFile()); //$NON-NLS-1$ //MiscStatic.print(outP, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); //$NON-NLS-1$ MiscStatic.print(outP, "<html lang=\"" + lang + "\" xml:lang=\"" + lang + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ MiscStatic.print(outP, "<head>\n"); //$NON-NLS-1$ MiscStatic .print(outP, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); //$NON-NLS-1$ MiscStatic.print(outP, "</head><BODY>\n"); //$NON-NLS-1$ String beginChar = ""; //$NON-NLS-1$ if (keyWords != null) { File keyWordsFile = new File(KeyWordIndexHelper.defObj .getWwwRoot() + KeyWordIndexHelper.defObj.getKeywordResultFile()); String path = KeyWordIndexHelper.defObj.getRelativePath() + KeyWordIndexHelper.defObj.getKeywordResultFile(); for (int i = 0; i < keyWords.size(); i++) { KeyWord tmp = (KeyWord) keyWords.elementAt(i); String firstL = tmp.getKeyWord().substring(0, 1) .toUpperCase(); if (firstL.compareTo(beginChar) != 0) { beginChar = firstL; MiscStatic.print(outP, "<A HREF=\"" + path + "#"); //$NON-NLS-1$ //$NON-NLS-2$ MiscStatic.print(outP, beginChar); MiscStatic .print( outP, "\" TARGET=\"" + KeyWordIndexHelper.defObj.getKeyWordTarget() + "\">"); //$NON-NLS-1$ //$NON-NLS-2$ MiscStatic.print(outP, beginChar); MiscStatic.print(outP, "</A>\n"); //$NON-NLS-1$ } } } MiscStatic.print(outP, "</BODY></html>"); //$NON-NLS-1$ outP.close(); } catch (Exception e) { System.err .println("KeyWordHolder:printIndex\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$ } } // Prints the keywordfile private void printKeyWords() { try { OutputStreamWriter outP; File file = new File(KeyWordIndexHelper.defObj.getWwwRoot() + KeyWordIndexHelper.defObj.getKeywordResultFile()); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } if (KeyWordIndexHelper.defObj.getCharacterSet() != null) { outP = new OutputStreamWriter(new FileOutputStream(file), KeyWordIndexHelper.defObj.getCharacterSet()); } else { outP = new OutputStreamWriter(new FileOutputStream(file)); } System.out.println(HelpMessages.WRITE_FILE + KeyWordIndexHelper.defObj.getWwwRoot() + "" + //$NON-NLS-1$ KeyWordIndexHelper.defObj.getKeywordResultFile()); String headerFile = MiscStatic.loadFile(KeyWordIndexHelper.defObj .getHeaderFile(), KeyWordIndexHelper.defObj .getCharacterSet()); if (headerFile.equalsIgnoreCase(Def.None)) { System.err.println(HelpMessages.INCORRECT_HEADERFILE + KeyWordIndexHelper.defObj.getHeaderFile()); } MiscStatic.print(outP, headerFile); String beginChar = ""; //$NON-NLS-1$ if (keyWords != null) { for (int i = 0; i < keyWords.size(); i++) { KeyWord tmp = (KeyWord) keyWords.elementAt(i); String firstL = tmp.getKeyWord().substring(0, 1) .toUpperCase(); if (firstL.compareTo(beginChar) != 0) { beginChar = firstL; FontObject fs = KeyWordIndexHelper.defObj .getStyleSheet(Def.HeadLineStyle); if (fs == null) { fs = KeyWordIndexHelper.defObj .getStyleSheet(Def.DefaultStyle); } FontObject f = null; FontObject fr = fs; if (fs == null) { f = KeyWordIndexHelper.defObj .getFont(Def.HeadLineFont); if (f == null) { f = KeyWordIndexHelper.defObj .getFont(Def.DefaultFont); } fr = f; } KeyWordIndexHelper.defObj.printStart(outP, fr); if (fs == null) { MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$ } MiscStatic .print( outP, "<A ID=\"_INDEX_ITEM_" + beginChar + "\" NAME=\"" + beginChar + "\">" + beginChar + "</A>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ if (fs == null) { MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$ } KeyWordIndexHelper.defObj.printEnd(outP, fr); } tmp.print(outP, 0); } } String footerFile = MiscStatic.loadFile(KeyWordIndexHelper.defObj .getFooterFile(), KeyWordIndexHelper.defObj .getCharacterSet()); if (footerFile.equalsIgnoreCase(Def.None)) { System.err.println(HelpMessages.INCORRECT_FOOTERFILE + KeyWordIndexHelper.defObj.getFooterFile()); } MiscStatic.print(outP, footerFile); outP.close(); } catch (Exception e) { System.err .println("KeyWordHolder:printKeyWords\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$ e.printStackTrace(); } } }