//------------------------------------------------------------------------------ // 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.OutputStreamWriter; import java.util.Vector; class KeyWord { private String keyWord=null; private Vector myKeyWords=null; private Vector myDocuments=null; private SpecKeyWord mySpecKeyWord=null; private KeyWord parentM=null; KeyWordDef def = null; KeyWord(KeyWordDef def) { this.def = def; keyWord = def.getKey(); } private KeyWord(KeyWordDef def, String keyWord, KeyWord key) { this.def = def; this.keyWord = keyWord; this.parentM = key; } String getKeyWord() { return keyWord; } void addKeyWord(KeyWordDef def, String key, Document doc) { int index = MiscStatic.getIndex(key, KeyWordIndexHelper.defObj.levelSeparatorReplace, 0); //If the bottom of the keyword is reached if(index==-1) { addDocument(doc); } else { int index2 = MiscStatic.getIndex(key, KeyWordIndexHelper.defObj.levelSeparatorReplace, index+1); String nextKeyWord=null; if(index2!=-1) { nextKeyWord = key.substring(index+1,index2); } else { nextKeyWord = key.substring(index+1); } KeyWord tmpKey = createKeyWord(def, nextKeyWord); if(tmpKey!=null) { tmpKey.addKeyWord(def, key.substring(index+1), doc); } } } void setSpecKeyWord(String relatedKey, boolean see) { IO.printDebug("setSpecKeyWord " + relatedKey); //$NON-NLS-1$ mySpecKeyWord = new SpecKeyWord(relatedKey, see); } void insertSpecKeyWord(String specKeyWordString, String 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); } while(!found && myKeyWords!=null && i<myKeyWords.size()) { KeyWord tmpK = (KeyWord)myKeyWords.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) { int index=-1; i=0; KeyWord newKeyWord2 = new KeyWord(null, firstKeyWord, this); IO.printDebug("new keyword " + firstKeyWord); //$NON-NLS-1$ if(pos==-1) { newKeyWord2.setSpecKeyWord(relatedKeyWord, true); } else { newKeyWord2.insertSpecKeyWord(specKeyWordString.substring(pos+1), relatedKeyWord); } if(myKeyWords==null) { IO.printDebug("myKeyWords"); //$NON-NLS-1$ myKeyWords = new Vector(); } while(index==-1 && i<myKeyWords.size()) { KeyWord tmpK = (KeyWord)myKeyWords.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) { myKeyWords.insertElementAt(newKeyWord2, index); } else { myKeyWords.insertElementAt(newKeyWord2, myKeyWords.size()); } } } private KeyWord createKeyWord(KeyWordDef def, String key) { if(myKeyWords==null) { myKeyWords = new Vector(); KeyWord newKeyWord = new KeyWord(def, key, this); myKeyWords.addElement(newKeyWord); return newKeyWord; } else { int index=-1; int i=0; KeyWord newKeyWord2 = new KeyWord(def, key, this); while(index==-1 && i<myKeyWords.size()) { KeyWord tmpK = (KeyWord)myKeyWords.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; } } else { return tmpK; } } i++; } if(index!=-1) { myKeyWords.insertElementAt(newKeyWord2, index); return newKeyWord2; } else { myKeyWords.insertElementAt(newKeyWord2, myKeyWords.size()); return newKeyWord2; } } } private void addDocument(Document doc) { doc.setKeyWord(this); if(myDocuments==null) { myDocuments = new Vector(); myDocuments.addElement(doc); } else { int index=-1; int i=0; while(index==-1 && i<myDocuments.size()) { Document tmpD = (Document)myDocuments.elementAt(i); if(doc.getTitle().compareTo(tmpD.getTitle())<0) { index = i; } i++; } if(index!=-1) { myDocuments.insertElementAt(doc, index); } else { myDocuments.insertElementAt(doc, myDocuments.size()); } } } void print(OutputStreamWriter outP, int level) { if(outP==null) { System.err.println("KeyWord:print\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$ return; } KeyWordIndexHelper.defObj.printStart(outP,level+1); if(level==0) { MiscStatic.print(outP, "<A NAME=\"" + keyWord+ "\"> </A>"); //$NON-NLS-1$ //$NON-NLS-2$ } MiscStatic.printSpace(outP, level*4); if(level!=0) { MiscStatic.printSpace(outP,2); } if(myDocuments!=null) { if(!KeyWordIndexHelper.defObj.getShowDocumentTitle() && !KeyWordIndexHelper.defObj.getMulitDocumentKeyword()) { Document tmpD = (Document) myDocuments.elementAt(0); tmpD.setKeyWord(this); MiscStatic.print(outP, "<A HREF=\"" + tmpD.getUrl() + "\" TARGET=\"" //$NON-NLS-1$ //$NON-NLS-2$ + KeyWordIndexHelper.defObj.getTarget() +"\">" + keyWord + "</A>"); //$NON-NLS-1$ //$NON-NLS-2$ } else if(!KeyWordIndexHelper.defObj.getMulitDocumentKeyword()) { MiscStatic.print(outP, keyWord); Document tmpD = (Document) myDocuments.elementAt(0); tmpD.setKeyWord(this); tmpD.print(outP); } else { MiscStatic.print(outP, keyWord); MiscStatic.printSpace(outP, 1); for(int i=0;i<myDocuments.size();i++) { Document tmpD = (Document) myDocuments.elementAt(i); tmpD.setKeyWord(this); tmpD.print(outP); if(i!=myDocuments.size()-1) { MiscStatic.print(outP, ", "); //$NON-NLS-1$ } MiscStatic.print(outP, "\n"); //$NON-NLS-1$ } } } else { MiscStatic.print(outP, keyWord); } if(mySpecKeyWord!=null) { mySpecKeyWord.print(outP); } if(KeyWordIndexHelper.defObj.getStyleSheet(Def.DefaultStyle)==null) { MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$ } KeyWordIndexHelper.defObj.printEnd(outP,level+1); if(myKeyWords!=null) { int tmpL = level+1; for(int i=0;i<myKeyWords.size();i++) { KeyWord tmpK = (KeyWord) myKeyWords.elementAt(i); tmpK.print(outP, tmpL); } } } String getAnchor() { if ( this.def != null) { return this.def.getAnchor(); } if(parentM!=null) { return parentM.getAnchor(); } return ""; //$NON-NLS-1$ } }