blob: 7d3e004af38e126eb45192de7ac932c09ecf3d1d [file] [log] [blame]
//------------------------------------------------------------------------------
// 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$
}
}