/** * Analytica - beta version - Systems Monitoring Tool * * Copyright (C) 2013, KleeGroup, direction.technique@kleegroup.com (http://www.kleegroup.com) * KleeGroup, Centre d'affaire la Boursidi�re - BP 159 - 92357 Le Plessis Robinson Cedex - France * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; * either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses> * * Linking this library statically or dynamically with other modules is making a combined work based on this library. * Thus, the terms and conditions of the GNU General Public License cover the whole combination. * * As a special exception, the copyright holders of this library give you permission to link this library * with independent modules to produce an executable, regardless of the license terms of these independent modules, * and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, * for each linked independent module, the terms and conditions of the license of that module. * An independent module is a module which is not derived from or based on this library. * If you modify this library, you may extend this exception to your version of the library, * but you are not obliged to do so. * If you do not wish to do so, delete this exception statement from your version. */ package io.analytica.api; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Builder permettant de contruire un processus. * Il y a deux modes de cr�ation. * - live (La date de d�but et celle de la cr�ation , la dur�e s'obtient lors de la cr�ation du process * - diff�r� (la date de d�bute et la dur�e sont renseign�e ensembles ) * * @author pchretien, npiedeloup * @version $Id: KProcessBuilder.java,v 1.18 2012/11/08 17:06:27 pchretien Exp $ */ public final class KProcessBuilder { private final String appName; private final String myType; private final Date startDate; private String myLocation; private String myCategory; //Tableau des mesures identifi�es par leur nom. private final Map<String, Double> measures; //Tableau des m�tadonn�es identifi�es par leur nom. private final Map<String, String> metaDatas; private final long start; private Double durationMs = null; private final List<KProcess> subProcesses; private final KProcessBuilder parent; /** * Constructeur. * La dur�e du processus sera obtenue lors de l'appel � la m�thode build(). * @param type Type du processus */ public KProcessBuilder(final String appName, final String type) { this(appName, type, null, new Date(), null); } /** * Constructeur . * @param type Type du processus * @param startDate Date de d�but processus * @param durationMs Dur�e du processus (Millisecondes) */ public KProcessBuilder(final String appName, final String type, final Date startDate, final double durationMs) { this(appName, type, null, startDate, durationMs); } private KProcessBuilder(final String appName, final String type, final KProcessBuilder parent, final Date startDate, final Double durationMs) { KProcessUtil.checkNotNull(appName, "appName is required"); KProcessUtil.checkNotNull(type, "type of process is required"); KProcessUtil.checkNotNull(startDate, "start of process is required"); //--- this.appName = appName; myType = type; measures = new HashMap<>(); metaDatas = new HashMap<>(); subProcesses = new ArrayList<>(); this.startDate = startDate; start = startDate.getTime(); this.parent = parent; //--------------------------------------------------------------------- this.durationMs = durationMs; } public KProcessBuilder withLocation(final String location) { myLocation = location; return this; } public KProcessBuilder withCategory(final String category) { myCategory = category; return this; } /** * Incr�ment d'une mesure. * Si la mesure est nouvelle, elle est automatiquement cr��e avec la valeur * @param mName Nom de la mesure * @param mValue Valeur � incr�menter * @return Builder */ public KProcessBuilder incMeasure(final String mName, final double mValue) { KProcessUtil.checkNotNull(mName, "Measure name is required"); //--------------------------------------------------------------------- final Double lastmValue = measures.get(mName); measures.put(mName, lastmValue == null ? mValue : mValue + lastmValue); return this; } /** * Mise � jour d'une mesure. * @param mName Nom de la mesure * @param mValue Valeur � incr�menter * @return Builder */ public KProcessBuilder setMeasure(final String mName, final double mValue) { KProcessUtil.checkNotNull(mName, "Measure name is required"); //--------------------------------------------------------------------- measures.put(mName, mValue); return this; } /** * Mise � jour d'une metadonn�e. * @param mdName Nom de la m�tadonn�e * @param mdValue Valeur de la m�tadonn�e * @return Builder */ public KProcessBuilder addMetaData(final String mdName, final String mdValue) { KProcessUtil.checkNotNull(mdName, "Metadata name is required"); KProcessUtil.checkNotNull(mdValue, "Metadata value is required"); //--------------------------------------------------------------------- metaDatas.put(mdName, mdValue); return this; } /** * Ajout d'un sous processus. * @param subStartDate Date de d�but * @param subDurationMs Dur�e du sous process en Ms * @param type Type du sous process * @return Builder */ public KProcessBuilder beginSubProcess(final String type, final Date subStartDate, final double subDurationMs) { return new KProcessBuilder(appName, type, this, subStartDate, subDurationMs).withLocation(myLocation); } /** * Fin d'un sous processus. * Le sous processus est automatiquement ajout� au processus parent. * @return Builder */ public KProcessBuilder endSubProcess() { KProcessUtil.checkNotNull(parent, "parent is required when you close a subprocess"); //--------------------------------------------------------------------- parent.addSubProcess(build()); return parent; } /** * Ajout d'un sous processus. * @param subPocess Sous-Processus � ajouter * @return Builder */ public KProcessBuilder addSubProcess(final KProcess subPocess) { KProcessUtil.checkNotNull(subPocess, "sub process is required "); //--------------------------------------------------------------------- subProcesses.add(subPocess); incMeasure(KProcess.SUB_DURATION, subPocess.getDuration()); return this; } /** * Construction du Processus. * @return Process */ public KProcess build() { //Si on est dans le mode de construction en runtime, on ajoute la dur�e. if (durationMs == null) { durationMs = Long.valueOf(System.currentTimeMillis() - start).doubleValue(); } //On ajoute la mesure obligatoire : dur�e setMeasure(KProcess.DURATION, durationMs); return new KProcess( appName, myType, myCategory, myLocation, startDate, measures, metaDatas, subProcesses); } }