/*
 * $Id: VKCEntity.java,v 1.14 2007/03/01 15:02:57 korowa Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: VKCEntity.java,v $
 * Revision 1.14  2007/03/01 15:02:57  korowa
 * Beschreibungen zur Kategorien und Dokumenten und News werden jetzt in eigener Tabelle NOTES über VKCNoteSerializer gespeichert und sind nicht begrenzt an Zeichenanzahl
 *
 * Revision 1.13  2004/10/13 12:52:28  koppy
 * +hasDynaAttribute(name, value)
 * +getDynaAttribute(name, value)
 *
 * Revision 1.12  2004/10/08 13:59:20  koppy
 * + getDynaAttribute()
 * + hasDynaAttribute()
 *
 * Revision 1.11  2004/06/27 17:16:55  marbobo
 * + Quellcode maintenance
 *
 * Revision 1.10  2004/02/24 08:51:00  bigmac
 * +getExternalKeywordsString()
 *
 * Revision 1.9  2003/11/11 11:55:31  teng
 * *** empty log message ***
 *
 * Revision 1.8  2003/08/30 11:40:59  jonyp
 * additional attributes
 *
 * Revision 1.7  2003/08/02 16:57:12  bigmac
 * *** empty log message ***
 *
 * Revision 1.6  2003/04/22 15:42:06  koppy
 * Kleinigkeiten
 *
 * Revision 1.5  2003/04/14 14:04:57  lawern
 * Parameter von VKCKeyword-Konstruktor hat sich geändert
 *
 * Revision 1.4  2003/04/08 21:20:41  marbobo
 * Serialisierung+Keywords-Ausgabe gefixt
 *
 * Revision 1.3  2003/03/05 23:36:06  koppy
 * Bugfixes + Optimierungen
 *
 * Revision 1.2  2003/03/03 22:53:45  koppy
 * Kleinigkeiten, bugfixes
 *
 * Revision 1.1  2003/02/23 13:23:32  koppy
 * Initiale Version
 *
 */
package vkc.db.entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

import vkc.util.VKCStringUtils;
import vkc.view.WebShare;

/**
 * Abstrakte Oberklasse von den VKC Entitäten VKCCategory, VKCDocument,
 * VKCUser.
 *
 * @author koppy
 * @version 1.0
 */
public abstract class VKCEntity implements Serializable {

    public final static Integer ID_UNDEFINED = new Integer(-1);

	private Collection dynaAttributes = new ArrayList();
	private Set keywords = new HashSet();
	private Integer dynaAttrsId = null;
	private Vector addAttributes = null;
	private Integer noteId = null;

	public VKCEntity() {
	}

	public boolean addKeyword(VKCKeyword keyword) {
		return keywords.add(keyword);
	}

	public void setKeywords(Set keywords) {
		this.keywords = keywords;
	}

	public void setKeywordsByString(String keys) {
		Vector v =
			VKCStringUtils.stringToVector(keys, WebShare.KEYWORDS_DELIMITER);

		keywords.clear();

		for (int i = 0; i < v.size(); i++)
			keywords.add(new VKCKeyword((String) v.elementAt(i)));
	}

	public Set getKeywords() {
		return keywords;
	}

	/**
	 * Gibt die Schlüsselbegriffe als <i>eine</i> Zeichenkette zurück
	 *
	 * @return die Zeichenkette der Schlüsselbegriffe
	 */
	public String getKeywordsAsString() {
		Set k = this.getKeywords();

		if ((k == null) || k.isEmpty()) {
			return "";
		}

		Iterator keyIter = k.iterator();
		StringBuffer kbuffer = new StringBuffer();

		while (keyIter.hasNext()){
		
			String kTerm = ((VKCKeyword) keyIter.next()).getTerm();
			
			if( kTerm == null || kTerm.length() <1)
				continue;
				
			kbuffer.append( kTerm );
			kbuffer.append( WebShare.KEYWORDS_DELIMITER );
							
		}
		
		
		int length = kbuffer.length(); 		
		if( length > 1 ){
			return kbuffer.substring( 0, length - WebShare.KEYWORDS_DELIMITER.length());
		} 

		return "";
	}

	/**
	 * Gibt die Schlüsselbegriffe als <i>eine</i> Zeichenkette zurück
	 *
	 * @return die Zeichenkette der Schlüsselbegriffe
	 */
	public String getExternalKeywordsString() {

		Set k = this.getKeywords();
		if ( k == null || k.isEmpty() ) {
			return "";
		}

		StringBuffer sb = new StringBuffer();

		int numKeywords = 0;
		for ( Iterator keyIter = k.iterator() ; keyIter.hasNext() ; ) {

			VKCKeyword keyword = (VKCKeyword)keyIter.next();
			if ( keyword.isInternal() ) {
				continue;
			}
						
			String term = keyword.getTerm();
			if( term == null || term.length()<1 ) {
				continue;
			}
			
			if ( numKeywords>0 ) {
				sb.append( WebShare.KEYWORDS_DELIMITER );
				sb.append( ' ' );
			}
			
			sb.append( term );
			numKeywords++;
		}
		
		return sb.toString();
	}

	public Collection getDynaAttributes() {
		return dynaAttributes;
	}

	public void setDynaAttributes(Collection dynaAttributes) {
		this.dynaAttributes = dynaAttributes;
	}

	public boolean addDynaAttribute(VKCDynaAttribute dynaAttribute) {
		return dynaAttributes.add(dynaAttribute);
	}

	/**
	 * Gibt die Id wieder, mit welcher die dynamischen Attribute verknppft sind
	 *
	 * @return
	 */
	public Integer getDynaAttrsId() {
		return dynaAttrsId;
	}

	public void setDynaAttrsId(Integer dynaAttrsId) {
		this.dynaAttrsId = dynaAttrsId;
	}
	
	/**
	 * Liefert einen Vector von VKCAddAttributes
	 */
	public Vector getAddAttributes() {
		return this.addAttributes;    	
	}
   
	/**
	 * Setzt einen Vector von VKCAddAttributes
	 */
	public void setAddAttributes(Vector addAttributes) {
		this.addAttributes = addAttributes;    	
	}

	/**
	 * Gibt das dynamische Attribute zurück
	 * @param attrName
	 * @return
	 */
	public VKCDynaAttribute getDynaAttribute( String attrName ){
	    
		for (Iterator iter = this.getDynaAttributes().iterator(); iter.hasNext();) {
            VKCDynaAttribute da = (VKCDynaAttribute) iter.next();
            if(da.getName().equals(attrName)){
                return da;
            }
        }
		
		return null;
	}
	
	public VKCDynaAttribute getDynaAttribute( String attrName, String attrValue ){
	    
		for (Iterator iter = this.getDynaAttributes().iterator(); iter.hasNext();) {
            VKCDynaAttribute da = (VKCDynaAttribute) iter.next();
            if(da.getName().equals(attrName) && da.getValue().equals(attrValue)){
                return da;
            }
        }
		
		return null;
	}
	
	public boolean hasDynaAttribute( String attrName ){
	    return this.getDynaAttribute(attrName) != null;
	}
	
	public boolean hasDynaAttribute( String attrName, String attrValue ){
	    return this.getDynaAttribute(attrName, attrValue) != null;
	}

	public Integer getNoteId() {
		return noteId;
	}

	public void setNoteId(Integer noteId) {
		this.noteId = noteId;
	}
}
