/*
 * Created on 23.11.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package kirjasto;



import org.nakedobjects.object.AbstractNakedObject;
import org.nakedobjects.object.NakedObject;
import org.nakedobjects.object.Title;
import org.nakedobjects.object.value.TextString;



/**
 * @author rakentaja
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Kommentti extends AbstractNakedObject {
        public static final long serialVersionUID = 2L;
        private final TextString kommentti;
        private final Title omatitle = new Title("Kommentti");
        private NakedObject olio; // viite olioon, johon tämä kommentti liittyy

    // "Rakenteellinen" rakennin
    public Kommentti() {
        kommentti = new TextString();

    }

    // "Toiminnallinen" rakennin
    public void created() {
        // ...
    }


    public TextString getKommentti() {
        return kommentti;
    }

    /** 
     * Tallennetaan sisäinen viite, joka estää kommentin 
     * liittämisen useaan olioon. 
     * Todo: tälle pitäis saada myös about, joka disabloi tarvittaessa...
     * @param o
     */
    public void associateOlio(NakedObject o) {
        //resolve(olio); // selvitä, onko jo liitetty jonnekin
        if (! allowAssociation(o) ) return;
        this.olio = o;
    }

    /**
     * Poistetaan kommentti
     * @return
     */
    public void dissociateOlio(NakedObject o) {
        if (this.olio == null) return; // katkaisee rekursion
        this.olio = null;

        // ei voida luottaa siihen, että o:lla olisi kommentin 
        // poistava metodi... joten katsotaan, onko oliolla 
        // dissociateKommentti -metodia, ja kutsutaan sitä...
        Class c = o.getClass();
        try {
          java.lang.reflect.Method m = c.getMethod("dissociateKommentti", new Class[] {Kommentti.class});
          if (m != null) m.invoke(o, new Object[] {this});
        } catch (Exception exp) {}


    }

// Yksinkertaisen otsikon rakentimet
// (englannille tarpeettomat usein)
public static String singularName() {
    return "Kommentti";
}
public static String pluralName() {
    return "Kommentit";
}
public Title title() {
    // erikoisemman otsikon rakennin
return kommentti.title().toString().equals("")?omatitle:kommentti.title();
}

        /**
         * Kommentin voi assosioida vain, jos siihen ei vielä liity oliota, 
         * tai mikäli assisiaatiota "uusitaan" samaan olioon. 
         * Tämän olion kutsu pitäsi tehdä pakolliseksi...
         * @param o
         * @return
         */
        public boolean allowAssociation(NakedObject o) {
                if (o == null) return true; // poistaminen on myös sallittua
                if (this.olio == null) return true;
                return o == this.olio;
        }
}