All Downloads are FREE. Search and download functionalities are using the official Maven repository.

oms3.dsl.Sim Maven / Gradle / Ivy

There is a newer version: 0.8.1
Show newest version
package oms3.dsl;

import groovy.lang.Closure;
import java.io.*;
import java.util.*;
import java.util.logging.*;

import oms3.ComponentAccess;
import oms3.annotations.*;
import oms3.Compound;
import oms3.Notification.*;

import oms3.doc.Documents;
import ngmf.util.OutputStragegy;
import ngmf.util.Validation;
import oms3.ComponentException;
import oms3.util.Components;

/** Core Simulation DSL
 *
 * @author od
 */
public class Sim extends AbstractSimulation {

    String alg = System.getProperty("oms3.digest.algorithm", "SHA-256");
    // The ontology
    Ontology ontology;
    List eff = new ArrayList();
    List sum = new ArrayList();
    File lastFolder;
    // Simulation resources.
    boolean digest = false;
    boolean sanitychecks = true;
    
    Closure pre;     
    Closure post;    

    /**
     * perform sanity checks for the model, default is true.
     * @param sanitychecks
     */
    public void setSanitychecks(boolean sanitychecks) {
        this.sanitychecks = sanitychecks;
    }

    public void setDigest(boolean digest) {
        this.digest = digest;
    }

    public void setPre(Closure pre) {
        this.pre = pre;
    }

    public void setPost(Closure post) {
        this.post = post;
    }

    @Override
    public Buildable create(Object name, Object value) {
        if (name.equals("ontology")) {
            return ontology = new Ontology();
        } else if (name.equals("efficiency")) {
            Efficiency e = new Efficiency();
            eff.add(e);
            return e;
        } else if (name.equals("summary")) {
            Summary e = new Summary();
            sum.add(e);
            return e;
        }
        return super.create(name, value);
    }

    @Override
    public Object run() throws Exception {
        if (getModel() == null) {
            throw new ComponentException("missing 'model' element.");
        }
        
        Compound.reload();

        if (!sanitychecks) {
            System.setProperty("oms.skipCheck", "true");
        }

        if (log.isLoggable(Level.CONFIG)) {
            log.config("Run configuration ...");
        }

        if (digest) {
            String d = digest(res);
            System.setProperty("oms3.digest", d);
            if (log.isLoggable(Level.CONFIG)) {
                log.config("Setting system property 'oms3.digest' to " + d);
            }
        }

        // Path
        String libPath = model.getLibpath();
        if (libPath != null) {
            System.setProperty("jna.library.path", libPath);
            if (log.isLoggable(Level.CONFIG)) {
                log.config("Setting jna.library.path to " + libPath);
            }
        }

        Object comp = model.getComponent();
        if (log.isLoggable(Level.CONFIG)) {
            log.config("TL component " + comp);
        }

        // setup component logging
        Logger.getLogger("oms3.model").setLevel(Level.OFF);
        Logging l = model.getComponentLogging();
        Map cl = l.getCompLevels();
        for (String compname : cl.keySet()) {
            String cll = cl.get(compname);
            Level level = Level.parse(cll);
            Logger logger = Logger.getLogger("oms3.model." + compname);
            logger.setUseParentHandlers(false);
            logger.setLevel(level);
            ConsoleHandler ch = new ConsoleHandler();
            ch.setLevel(level);
            ch.setFormatter(new GenericBuilderSupport.CompLR());
            logger.addHandler(ch);
        }
        
        // call the prerun scripts
        if (pre != null) {
            pre.call(comp);
        }
        
        if (log.isLoggable(Level.INFO)) {
            log.info("Init ...");
        }

        ComponentAccess.callAnnotated(comp, Initialize.class, true);

        // setting the input data;
        Map parameter = model.getParameter();
        boolean success = ComponentAccess.setInputData(parameter, comp, log);
        if (!success) {
            throw new ComponentException("There are Parameter problems. Simulation exits.");
        }

        OutputStragegy st = output.getOutputStrategy(getName());
        lastFolder = st.nextOutputFolder();
        if (log.isLoggable(Level.CONFIG)) {
            log.config("Simulation output folder: " + lastFolder);
        }
        
        boolean adjusted = ComponentAccess.adjustOutputPath(lastFolder, comp, log);
        // only create this folder if there is a need.
        if (adjusted) {
            lastFolder.mkdirs();
        }

        if (comp instanceof Compound && log.isLoggable(Level.FINEST)) {
            Compound c = (Compound) comp;
            c.addListener(new Listener() {

                @Override
                public void notice(Type arg0, EventObject arg1) {
                    log.finest(arg0 + " -> " + arg1);
                }
            });
        }

        if (sanitychecks) {
            if (comp instanceof Compound) {
                Compound c = (Compound) comp;
                c.addListener(new Listener() {

                    @Override
                    public void notice(Type arg0, EventObject arg1) {
                        if (arg0 == Type.EXCEPTION) {
                            ExceptionEvent ee = (ExceptionEvent) arg1;
                            if (ee.getException() != null) {
                                log.severe(arg0 + " -> " + ee);
                            }
                        }
                    }
                });

                if (log.isLoggable(Level.FINE)) {
                    c.addListener(new Listener() {

                        @Override
                        public void notice(Type arg0, EventObject arg1) {
                            if (arg0 == Type.OUT) {
                                DataflowEvent e = (DataflowEvent) arg1;
                                Object v = e.getValue();
                                if (v == null) {
                                    log.fine("'null' output from " + e.getAccess().toString());
                                }
                            }
                        }
                    });
                }
            }
        }

        for (Efficiency e : eff) {
            e.setup(comp);
        }
        for (Summary e : sum) {
            e.setup(comp);
        }
        for (Output e : out) {
            e.setup(comp, lastFolder, getName());
        }

        // execute phases and be done.
        if (log.isLoggable(Level.INFO)) {
            log.info("Exec ...");
        }
        long t2 = System.currentTimeMillis();
        ComponentAccess.callAnnotated(comp, Execute.class, false);
        long t3 = System.currentTimeMillis();


        if (log.isLoggable(Level.INFO)) {
            log.info("Finalize ...");
        }
        ComponentAccess.callAnnotated(comp, Finalize.class, true);

        if (comp instanceof Compound) {
            Compound c = (Compound) comp;
            c.shutdown();
        }
        
        
        for (Efficiency e : eff) {
            e.printEff(lastFolder);
        }
        for (Summary e : sum) {
            e.printSum(lastFolder);
        }
        for (Output e : out) {
            e.done();
        }

        if (log.isLoggable(Level.INFO)) {
            log.info("Finished [" + (t3 - t2) + " ms]");
        }
        
        if (post != null) {
            post.call(comp);
        }
        
        return comp;
    }

    /**
     *
     * @throws Exception
     */
    @Override
    public void doc() throws Exception {
        OutputStragegy st = output.getOutputStrategy(getName());
        st.lastOutputFolder().mkdirs();
        document(new File(st.lastOutputFolder(), getName() + ".xml"));
    }

    /**
     * Generate Simulation Documentation in Docbook 5.
     * 
     * @param file
     * @throws Exception
     */
    void document(File file) throws Exception {
        Locale locale = Locale.getDefault();
        if (System.getProperty("oms3.locale.lang") != null) {
            locale = new Locale(System.getProperty("oms3.locale.lang"));
        }
        Documents.db5Sim(file, // output file
                model.getComponent().getClass(), // the model class
                model.getParameter(), // all merged parameter
                getName(),
                locale);// simulation name

        System.out.println(" Generated: " + file);
    }

    /**
     * 
     * @throws Exception
     */
    @Override
    public void dig() throws Exception {
        System.out.println("Digest [" + alg + "]:");
        System.out.println(digest());
    }

    /**
     * Get the simulation digest record.
     * 
     * @return the digest record string
     * @throws Exception 
     */
    public String digest() throws Exception {
        StringBuffer b = new StringBuffer();
        b.append(digest(res) + '\n');
        Collection> c = Components.internalComponents(model.getComponent().getClass());
        // model classes
        for (Class cl : c) {
            b.append("    " + cl.getName() + " & ");
            SourceInfo si = (SourceInfo) cl.getAnnotation(SourceInfo.class);
            if (si != null) {
                b.append(si.value());
            }
            b.append(" ; ");
            VersionInfo vi = (VersionInfo) cl.getAnnotation(VersionInfo.class);
            if (vi != null) {
                b.append(vi.value());
            }
            b.append('\n');
        }
        // parameter files.
        for (File f : res.filterFiles("csv")) {
            b.append("    " + f.getName() + " & ");
            b.append('\n');
        }
        return b.toString();
    }

    /**
     * Create a message digest for the simulation
     * 
     * @param r simulation resources
     * @return the digest as 
     */
    private String digest(Resource r) {
        if (r.getRecources().isEmpty()) {
            return null;
        }
        List f = new ArrayList();
        for (String s : r.getRecources()) {
            f.add(new File(s));
        }
        return Validation.hexDigest(alg, f.toArray(new File[0]));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy