Added multi categories for software.

This commit is contained in:
Christian P. MOMON 2020-10-19 02:17:57 +02:00
parent 7ac3a80631
commit be6c6e1643
10 changed files with 158 additions and 46 deletions

View file

@ -44,29 +44,17 @@ public class Categories extends ArrayList<Category>
* the software name * the software name
* @return the category * @return the category
*/ */
public Category findBySoftware(final String softwareName) public Categories findBySoftware(final String softwareName)
{ {
Category result; Categories result;
boolean ended = false; result = new Categories();
Iterator<Category> iterator = this.iterator();
result = null;
while (!ended)
{
if (iterator.hasNext())
{
Category category = iterator.next();
if (category.getSoftwares().contains(softwareName)) for (Category category : this)
{ {
ended = true; if (category.getSoftwares().containsAnyIgnoreCase(softwareName))
result = category;
}
}
else
{ {
ended = true; result.add(category);
result = null;
} }
} }

View file

@ -112,11 +112,11 @@ public class Factory
Category other = new Category("Autres", "Qui ne rentre pas dans une catégorie existante."); Category other = new Category("Autres", "Qui ne rentre pas dans une catégorie existante.");
result.add(other); result.add(other);
for (Service service : federation.getAllServices()) for (Software software : federation.getSoftwares().values())
{ {
if (!result.matches(service.getSoftwareName())) if (!result.matches(software.getName()))
{ {
other.getSoftwares().add(service.getSoftwareName()); other.getSoftwares().add(software.getName());
} }
} }

View file

@ -263,7 +263,7 @@ public class Federation extends PathPropertyList
if (software == null) if (software == null)
{ {
software = new Software(service.getSoftwareName(), service.get("software.description")); software = new Software(service.getSoftwareName(), service.getSoftwareDescription());
result.put(software); result.put(software);
} }
} }

View file

@ -317,6 +317,21 @@ public class Service extends PathPropertyList
return result; return result;
} }
/**
* Gets the software description.
*
* @return the software description
*/
public String getSoftwareDescription()
{
String result;
result = get("software.description");
//
return result;
}
/** /**
* Gets the software license name. * Gets the software license name.
* *

View file

@ -0,0 +1,103 @@
/*
* Copyright (C) 2020 Christian Pierre MOMON <christian@momon.org>
*
* This file is part of StatoolInfos, simple service statistics tool.
*
* StatoolInfos is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* StatoolInfos 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with StatoolInfos. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.devinsy.statoolinfos.htmlize;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.statoolinfos.core.Categories;
import fr.devinsy.statoolinfos.core.Category;
import fr.devinsy.statoolinfos.core.StatoolInfosException;
import fr.devinsy.xidyn.XidynException;
import fr.devinsy.xidyn.data.TagDataManager;
import fr.devinsy.xidyn.presenters.PresenterUtils;
import fr.devinsy.xidyn.utils.XidynUtils;
/**
* The Class CategoriesView.
*/
public class CategoriesView
{
private static Logger logger = LoggerFactory.getLogger(CategoriesView.class);
public enum Mode
{
ALL,
ICONS_ONLY,
LABELS_ONLY
}
/**
* Builds the.
*
* @param stats
* the stats
* @return the string
* @throws StatoolInfosException
* the statool infos exception
*/
public static String build(final Categories categories, final Mode mode) throws StatoolInfosException
{
String result;
try
{
logger.debug("Building categories view.");
TagDataManager data = new TagDataManager();
int index = 0;
for (Category category : categories)
{
data.setAttribute("category", index, "categoryLink", "href", "category-" + category.getTechnicalName() + ".xhtml");
data.setAttribute("category", index, "categoryLink", "title", category.getDescription());
if ((mode == Mode.ALL) || (mode == Mode.ICONS_ONLY))
{
data.setAttribute("category", index, "categoryLogo", "src", category.getLogoPath());
}
else
{
data.setAttribute("category", index, "categoryLogo", "class", "xid:nodisplay");
}
if ((mode == Mode.ALL) || (mode == Mode.LABELS_ONLY))
{
data.setEscapedContent("category", index, "categoryName", category.getName());
}
else
{
data.setAttribute("category", index, "categoryName", "class", "xid:nodisplay");
}
index += 1;
}
String page = PresenterUtils.dynamize("/fr/devinsy/statoolinfos/htmlize/categoriesView.xhtml", data).toString();
result = XidynUtils.extractBodyContent(page.replaceAll("id=\"[^\"]*\"", ""));
}
catch (XidynException exception)
{
throw new StatoolInfosException("Error building categories view: " + exception.getMessage(), exception);
}
//
return result;
}
}

View file

@ -22,6 +22,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fr.devinsy.statoolinfos.core.StatoolInfosException; import fr.devinsy.statoolinfos.core.StatoolInfosException;
import fr.devinsy.statoolinfos.htmlize.CategoriesView.Mode;
import fr.devinsy.statoolinfos.stats.softwares.SoftwareStat; import fr.devinsy.statoolinfos.stats.softwares.SoftwareStat;
import fr.devinsy.statoolinfos.stats.softwares.SoftwareStats; import fr.devinsy.statoolinfos.stats.softwares.SoftwareStats;
import fr.devinsy.xidyn.XidynException; import fr.devinsy.xidyn.XidynException;
@ -62,12 +63,8 @@ public class SoftwaresPage
data.setEscapedContent("softwareListLine", index, "softwareListLineNameLink", stat.getName()); data.setEscapedContent("softwareListLine", index, "softwareListLineNameLink", stat.getName());
data.setAttribute("softwareListLine", index, "softwareListLineNameLink", "href", "software-" + stat.getTechnicalName() + ".xhtml"); data.setAttribute("softwareListLine", index, "softwareListLineNameLink", "href", "software-" + stat.getTechnicalName() + ".xhtml");
data.setEscapedContent("softwareListLine", index, "softwareListLineCategoryName", stat.getCategory().getName()); data.setContent("softwareListLine", index, "softwareListLineCategory", CategoriesView.build(stat.getCategories(), Mode.ALL));
data.setAttribute("softwareListLine", index, "softwareListLineCategoryLink", "href", "category-" + stat.getCategory().getTechnicalName() + ".xhtml");
data.setAttribute("softwareListLine", index, "softwareListLineCategoryLink", "title", stat.getCategory().getDescription());
data.setAttribute("softwareListLine", index, "softwareListLineCategoryLogo", "src", stat.getCategory().getLogoPath());
data.setEscapedContent("softwareListLine", index, "softwareListLineSoftwares", stat.getCategory().getName());
data.setContent("softwareListLine", index, "softwareListLineOrganizationCount", stat.getOrganizationCount()); data.setContent("softwareListLine", index, "softwareListLineOrganizationCount", stat.getOrganizationCount());
data.setContent("softwareListLine", index, "softwareListLineServiceCount", stat.getServiceCount()); data.setContent("softwareListLine", index, "softwareListLineServiceCount", stat.getServiceCount());
data.setContent("softwareListLine", index, "categoryListLineUserCount", stat.getUserCount()); data.setContent("softwareListLine", index, "categoryListLineUserCount", stat.getUserCount());

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>StatoolInfos</title>
<meta charset="UTF-8" />
<meta name="keywords" content="statoolinfos,devinsy,federation" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<link rel="stylesheet" type="text/css" href="statoolinfos.css" />
</head>
<body>
<span id="category">
<a id="categoryLink" href="#" title="Catégorie">
<img id="categoryLogo" src="categories/default.png" style="width: 26px; height: 26px; padding-top:0; padding-bottom: 0; vertical-align: middle;"/>
<span id="categoryName">n/a</span>
</a>
</span>
</body>
</html>

View file

@ -21,7 +21,7 @@
<thead> <thead>
<tr> <tr>
<th class="">Nom</th> <th class="">Nom</th>
<th class="">Catégorie</th> <th class="">Catégories</th>
<th class="" style="width: 100px;">Services</th> <th class="" style="width: 100px;">Services</th>
<th class="" style="width: 100px;">Organisations</th> <th class="" style="width: 100px;">Organisations</th>
<th class="" style="width: 100px;">Utilisateurs mensuels</th> <th class="" style="width: 100px;">Utilisateurs mensuels</th>
@ -32,12 +32,7 @@
<td id="softwareListLineName" style="padding-top: 0; padding-bottom: 0;"> <td id="softwareListLineName" style="padding-top: 0; padding-bottom: 0;">
<a href="#" id="softwareListLineNameLink" title="">n/a</a> <a href="#" id="softwareListLineNameLink" title="">n/a</a>
</td> </td>
<td id="softwareListLineCategory" style="padding-top: 0; padding-bottom: 0;"> <td id="softwareListLineCategory" style="padding-top: 0; padding-bottom: 0;">n/a</td>
<a href="#" id="softwareListLineCategoryLink" title="">
<img id="softwareListLineCategoryLogo" src="categories/default.png" style="width: 26px; height: 26px; padding-top:0; padding-bottom: 0; vertical-align: middle;"/>
&#160;<span id="softwareListLineCategoryName">n/a</span>
</a>
</td>
<td id="softwareListLineServiceCount" class="td_number">n/a</td> <td id="softwareListLineServiceCount" class="td_number">n/a</td>
<td id="softwareListLineOrganizationCount" class="td_number">n/a</td> <td id="softwareListLineOrganizationCount" class="td_number">n/a</td>
<td id="softwareListLineUserCount" class="td_number">n/a</td> <td id="softwareListLineUserCount" class="td_number">n/a</td>

View file

@ -172,6 +172,7 @@ public class StatAgent
for (Software software : catalog.values()) for (Software software : catalog.values())
{ {
SoftwareStat stat = new SoftwareStat(software.getName()); SoftwareStat stat = new SoftwareStat(software.getName());
stat.getCategories().addAll(categories.findBySoftware(software.getName()));
StringSet organizations = new StringSet(); StringSet organizations = new StringSet();
for (Service service : federation.getAllServices()) for (Service service : federation.getAllServices())
{ {
@ -180,7 +181,6 @@ public class StatAgent
{ {
stat.incServiceCount(); stat.incServiceCount();
stat.incUserCount(service.getUserCount()); stat.incUserCount(service.getUserCount());
stat.setCategory(categories.findBySoftware(service.getSoftwareName()));
organizations.add(service.getOrganization().getName()); organizations.add(service.getOrganization().getName());
} }
} }

View file

@ -18,7 +18,7 @@
*/ */
package fr.devinsy.statoolinfos.stats.softwares; package fr.devinsy.statoolinfos.stats.softwares;
import fr.devinsy.statoolinfos.core.Category; import fr.devinsy.statoolinfos.core.Categories;
import fr.devinsy.statoolinfos.core.StatoolInfosUtils; import fr.devinsy.statoolinfos.core.StatoolInfosUtils;
/** /**
@ -27,7 +27,7 @@ import fr.devinsy.statoolinfos.core.StatoolInfosUtils;
public class SoftwareStat public class SoftwareStat
{ {
private String name; private String name;
private Category category; private Categories categories;
private int serviceCount; private int serviceCount;
private int organizationCount; private int organizationCount;
private int userCount; private int userCount;
@ -41,15 +41,15 @@ public class SoftwareStat
public SoftwareStat(final String name) public SoftwareStat(final String name)
{ {
this.name = name; this.name = name;
this.category = null; this.categories = new Categories();
this.serviceCount = 0; this.serviceCount = 0;
this.organizationCount = 0; this.organizationCount = 0;
this.userCount = 0; this.userCount = 0;
} }
public Category getCategory() public Categories getCategories()
{ {
return this.category; return this.categories;
} }
public String getName() public String getName()
@ -114,11 +114,6 @@ public class SoftwareStat
this.userCount += value; this.userCount += value;
} }
public void setCategory(final Category category)
{
this.category = category;
}
public void setName(final String name) public void setName(final String name)
{ {
this.name = name; this.name = name;