/** * 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> */ package io.analytica.museum; import io.analytica.api.KProcess; import io.analytica.api.KProcessBuilder; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; final class Pages { public final static PageBuilder HOME = new HomePage(); public final static PageBuilder ARTIST_SEARCH = new SearchArtistPage(); public final static PageBuilder OEUVRE_SEARCH = new SearchOeuvrePage(); public final static PageBuilder ARTIST = new ArtistPage(); public final static PageBuilder OEUVRE = new OeuvrePage(); public final static PageBuilder EXPOSITION = new ExpositionPage(); public final static PageBuilder IMAGE_ARTIST = new ImageArtistPage(); public final static PageBuilder IMAGE_OEUVRE = new ImageOeuvrePage(); private static final String ERROR_MEASURE = "error"; private static final String PAGE_PROCESS = "page"; private static final String SERVICE_PROCESS = "service"; private static final String SQL_PROCESS = "sql"; private static final String SEARCH_PROCESS = "search"; private static class HomePage implements PageBuilder { @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 5, 40, 5, 40, 5, 40, 5, 40); //@formatter:off return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4, 5, 6, 7, 8)).withCategory("home" ) .withCategory("home") .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("CommunicationServices/loadNews" ) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory("select * from news" ) .endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory("ExpositionServices/loadPushExpositions" ) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory("select * from expositions" ).endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 5, 6)).withCategory( "OeuvreServices/loadPushOeuvres" ) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 6)).withCategory( "select * from oeuvres" ).endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 7, 8)).withCategory( "OeuvreServices/loadFavoriesOeuvres" ) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 8)).withCategory("select * from oeuvres" ).endSubProcess() .endSubProcess() .build(); //@formatter:on } } private static class SearchArtistPage implements PageBuilder { @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 50, 150, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10); //@formatter:off return new KProcessBuilder(Museum.APP_NAME, "search", dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)).withCategory("artists")// .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("ArtistServices/search" ) .beginSubProcess(SEARCH_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory( "find artists" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory( "images/artists/"+ String.valueOf(StatsUtil.random(100, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory( "select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 5, 6)).withCategory("images/artists"+String.valueOf(StatsUtil.random(101, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 6)).withCategory( "select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 7, 8)).withCategory("images/artists"+ String.valueOf(StatsUtil.random(102, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 8)).withCategory("select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 9, 10)).withCategory( "images/artists"+String.valueOf(StatsUtil.random(103, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 10)).withCategory( "select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 11, 12)).withCategory( "images/artists"+String.valueOf(StatsUtil.random(104, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 12)).withCategory( "select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 13, 14)).withCategory("images/artists/"+ String.valueOf(StatsUtil.random(105, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 14)).withCategory("select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 15, 16)).withCategory("images/artists"+ String.valueOf(StatsUtil.random(106, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 16)).withCategory( "select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 17, 18)).withCategory("images/artists"+ String.valueOf(StatsUtil.random(107, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 18)).withCategory("select data from blob" ).endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 19, 20)).withCategory("images/artists"+String.valueOf(StatsUtil.random(108, 1)) ) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 20)).withCategory( "select data from blob").endSubProcess() .endSubProcess() .build(); //@formatter:on } } private static class SearchOeuvrePage implements PageBuilder { @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 50, 250, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10); return new KProcessBuilder(Museum.APP_NAME, "search", dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)).withCategory("oeuvres") .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("OeuvreServices/search") .beginSubProcess(SEARCH_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory("find oeuvres").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(200, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 5, 6)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(201, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 6)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 7, 8)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(202, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 8)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 9, 10)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(203, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 10)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 11, 12)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(204, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 12)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 13, 14)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(205, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 14)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 15, 16)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(206, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 16)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 17, 18)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(207, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 18)).withCategory("select data from blob").endSubProcess() .endSubProcess() .beginSubProcess(PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 19, 20)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(208, 1))) .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 20)).withCategory("select data from blob").endSubProcess() .endSubProcess() .build(); } } private static class ImageOeuvrePage implements PageBuilder { @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 5, 15); return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1)).withCategory("images/oeuvres" + String.valueOf(StatsUtil.random(200, 1))) .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1)).withCategory("select data from blob").endSubProcess() .build(); } } private static class ImageArtistPage implements PageBuilder { @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 5, 10); return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1)).withCategory("images/artists" + String.valueOf(StatsUtil.random(100, 1))) .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1)).withCategory("select data from blob").endSubProcess() .build(); } } private static class ArtistPage implements PageBuilder { //On joue sur plusieurs listes de fa�on � ne pas avoir une �quir�partition des donn�es. private static final String[] artistsA = "vinci;monet;picasso;renoir;rubens".split(";"); private static final String[] artistsB = "bazille;bonnard;munch;signac;hopper;c�zanne;bacon;johnes;rothko;warhol".split(";"); @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 5, 20, 5, 20); final String artist = getArtist(); return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4)).withCategory("artists/" + artist) .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("ArtistServices/loadArtist") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory("select * from artists").endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory("OeuvreServices/loadOeuvreByArtId") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory("select * from oeuvres").endSubProcess() .endSubProcess().build(); } private static String getArtist() { final String[] artists = Math.random() > 0.3 ? artistsA : artistsB; final int r = Double.valueOf(Math.random() * artists.length).intValue(); return artists[r]; } } private static class OeuvrePage implements PageBuilder { //On joue sur plusieurs listes de fa�on � ne pas avoir une �quir�partition des donn�es. private static final String[] oeuvresA = "Le Bapt�me du Christ;L'Annonciation;Ginevra de'Benci;La Madone � l'�illet;Madonna Benois;Saint J�r�me;L'Adoration des mages;La Vierge aux rochers;La Dame � l'hermine;Madonna Litta;Portrait de musicien;La Belle Ferronni�re;La C�ne;La Vierge aux rochers;Sala delle Asse;La Vierge, l'Enfant J�sus avec sainte Anne et saint Jean Baptiste;La Madone aux fuseaux;La Joconde�ou�Mona Lisa;Jeune fille d�coiff�e;La Vierge, l'Enfant J�sus et sainte Anne;Bacchus;Saint Jean Baptiste".split(";"); private static final String[] oeuvresB = "Autoportrait 1901;La C�lestine;Les Demoiselles d'Avignon;Dora Maar au chat;Gar�on � la pipe;Guernica;Massacre en Cor�e;Les Noces de Pierrette;Maya � la poup�e;Nu au plateau de sculpteur;Le R�ve;Le Vieux Guitariste aveugle".split(";"); private static final String[] oeuvresC = "Achille Emperaire;Nature morte � la bouilloire;La Pendule noire;Pastorale ou l'Idylle;La Maison du pendu;Autoportrait;Madame C�zanne dans un fauteuil rouge;Pont de Maincy;Cour de ferme � Auvers;Pommes et biscuits;Plateau de la montagne Sainte Victoire;L'Estaque, vue du golfe de Marseille;Vase de fleurs et pommes;Les Collines de Meyreuil;Gardanne le soir, Vue de la colline des fr�res;Gardanne, Vue de Saint Andr�;Les rideaux;Payannet et la Sainte-Victoire. Environs de Gardanne;L'aqueduc;Marronniers et ferme du Jas de Bouffon;Pont sur la Marne � Cr�teil;La table de cuisine (Nature morte au panier);Mardi-gras;Madame C�zanne sur une chaise jaune;Les Joueurs de cartes;Les baigneurs;Baigneurs;Femme � la cafeti�re;Le Gar�on au gilet rouge;Les Grandes Baigneuses;Oignons et bouteille;Joachim Gasquet;Paysan � la blouse bleue;Pommes et oranges;Nature morte aux oignons;Fumeur accoud�;Oignons et bouteille;Le fumeur;Le rocher rouge;Le ch�teau noir;Montagne Sainte Victoire;Rocher de Bibemus;Vieille Femme au rosaire;La Montagne Sainte-Victoire et le Ch�teau Noir" .split(";"); @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 5, 50, 5, 20); final String oeuvre = getOeuvre(); return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4)).withCategory("oeuvres/" + oeuvre) .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("OeuvreServices/loadOeuvre") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory("select * from oeuvres").endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory("ExpositionServices/loadExpositionByOeuId") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory("select * from expositions").endSubProcess() .endSubProcess().build(); } private static String getOeuvre() { final String[] oeuvres = Math.random() < 0.5 ? oeuvresA : Math.random() < 0.7 ? oeuvresB : oeuvresC; final int r = Double.valueOf(Math.random() * oeuvres.length).intValue(); return oeuvres[r]; } } private static class ExpositionPage implements PageBuilder { private static final String[] museums = "Mus�e du Louvre,Paris;Mus�e d'Orsay,Paris;The Metropolitan Museum of Art,New York;Pushkin Museum,Moscow;Courtauld Institute Galleries,London".split(";"); private static final String[] annees = "1954;1966;1970;1982;1991;2002;2005;2007;2008;2009;2010;2011;2011;2012;2012;2012;2013;2013;2013;2013".split(";"); @Override public KProcess createPage(final Date dateVisite) { final int[] randomDurations = StatsUtil.randoms(getCoef(dateVisite), 100, 5, 20, 5, 50, 5, 40); final String[] expositionInfos = getExposition().split(",");// [Mus�e,Ville,Ann�e] return new KProcessBuilder(Museum.APP_NAME, PAGE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 0, 1, 2, 3, 4, 5, 6)).withCategory("exposition/" + expositionInfos[0] + "/" + expositionInfos[1] + "/" + expositionInfos[2]) .withLocation("mexico") .setMeasure(ERROR_MEASURE, StatsUtil.randomValue(1, 0.01, 100, 0))// 1% d'erreur .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 1, 2)).withCategory("ExpositionServices/loadExposition") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 2)).withCategory("select * from expositions").endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 3, 4)).withCategory("OeuvreServices/loadOeuvreByExpId") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 4)).withCategory("select * from oeuvres").endSubProcess() .endSubProcess() .beginSubProcess(SERVICE_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 5, 6)).withCategory("ArtistServices/loadArtistByExpId") .beginSubProcess(SQL_PROCESS, dateVisite, StatsUtil.sum(randomDurations, 6)).withCategory("select from artists").endSubProcess() .endSubProcess() .build(); } private static String getExposition() { final int m = Double.valueOf(Math.random() * museums.length).intValue(); final String museum = museums[m]; final int a = Double.valueOf(Math.random() * annees.length).intValue(); final String annee = annees[a]; return museum + "," + annee; } } /** * Fournit le coef de charge * @param date Date * @return charge coef at this hour */ private static double getCoef(final Date date) { final Calendar calendar = new GregorianCalendar(); calendar.setTime(date); final int h = calendar.get(Calendar.HOUR_OF_DAY); if (h <= 5 || h >= 21) { return 0.6; } return 1 + 0.5 * (0.35 * Math.sin((h - 7) * Math.PI / 4d) + 0.15 * Math.sin((h - 7 - 2 / 3d) * Math.PI / 8d)); //varie de 0.6 � 1.5 (entre 6h et 20h) } }