Update JGraphT.

Code refactoring.
This commit is contained in:
Vova Perebykivskyi 2016-04-28 14:42:42 +03:00 committed by Dgray16
parent 4134315421
commit 3adb216e56
9 changed files with 1272 additions and 1137 deletions

View file

@ -137,7 +137,7 @@
<!-- JGraphT -->
<dependency>
<groupId>org.jgrapht</groupId>
<artifactId>jgrapht-jdk1.5</artifactId>
<artifactId>jgrapht-core</artifactId>
</dependency>
<!-- Junit -->

View file

@ -444,6 +444,7 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- TODO put it to main pom? -->
<!-- Java mail -->
<dependency>
<groupId>javax.mail</groupId>
@ -488,7 +489,7 @@
<!-- JGraphT -->
<dependency>
<groupId>org.jgrapht</groupId>
<artifactId>jgrapht-jdk1.5</artifactId>
<artifactId>jgrapht-core</artifactId>
</dependency>
<!-- jqPlot -->

View file

@ -40,23 +40,21 @@ public class I18nHelper {
private static Locale defaultLang = Locale.ENGLISH;
private static HashMap<Locale, I18n> localesCache = new HashMap<Locale, I18n>();
private static HashMap<Locale, I18n> localesCache = new HashMap<>();
public static I18n getI18n() {
setPreferredLocale();
Locale locale = Locales.getCurrent();
if (localesCache.keySet().contains(locale)) {
if ( localesCache.keySet().contains(locale) ) {
return localesCache.get(locale);
}
I18n i18n = I18nFactory.getI18n(I18nHelper.class, locale,
org.xnap.commons.i18n.I18nFactory.FALLBACK);
I18n i18n = I18nFactory.getI18n(I18nHelper.class, locale, org.xnap.commons.i18n.I18nFactory.FALLBACK);
// The language returned is not the same as the requested by the user
if (!locale.getLanguage().equals(
i18n.getResources().getLocale().getLanguage())) {
if ( !locale.getLanguage().equals(i18n.getResources().getLocale().getLanguage()) ) {
// Force it to be default language
i18n = getDefaultI18n();
}
@ -67,11 +65,10 @@ public class I18nHelper {
private static void setPreferredLocale() {
Execution execution = Executions.getCurrent();
if (execution != null) {
if ( execution != null ) {
Locale userLocale = getUserLocale();
Charsets.setPreferredLocale((HttpSession) execution.getSession()
.getNativeSession(), userLocale);
if (userLocale != null) {
Charsets.setPreferredLocale((HttpSession) execution.getSession().getNativeSession(), userLocale);
if ( userLocale != null ) {
Locales.setThreadLocal(userLocale);
}
}
@ -79,18 +76,17 @@ public class I18nHelper {
private static Locale getUserLocale() {
User user = UserUtil.getUserFromSession();
if (user != null) {
return user.getApplicationLanguage().getLocale();
}
return null;
return (user != null) ? user.getApplicationLanguage().getLocale() : null;
}
private static I18n getDefaultI18n() {
I18n i18n = localesCache.get(defaultLang);
if (i18n == null) {
i18n = I18nFactory.getI18n(I18nHelper.class, defaultLang,
org.xnap.commons.i18n.I18nFactory.FALLBACK);
if ( i18n == null ) {
i18n = I18nFactory.getI18n(I18nHelper.class, defaultLang, org.xnap.commons.i18n.I18nFactory.FALLBACK);
}
return i18n;
}
@ -114,8 +110,7 @@ public class I18nHelper {
return getI18n().tr(text, o1, o2, o3);
}
public static String _(String text, Object o1, Object o2, Object o3,
Object o4) {
public static String _(String text, Object o1, Object o2, Object o3, Object o4) {
return getI18n().tr(text, o1, o2, o3, o4);
}

View file

@ -111,8 +111,7 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
this.disabled = disabled;
}
public CustomMenuItem(String name, String url,
List<CustomMenuItem> children) {
public CustomMenuItem(String name, String url, List<CustomMenuItem> children) {
this.name = name;
this.unencodedURL = url;
this.encodedURL = Executions.getCurrent().encodeURL(url);
@ -135,20 +134,22 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
public boolean contains(String requestPath) {
for (CustomMenuItem item : thisAndChildren()) {
if (requestContains(requestPath, item.unencodedURL)) {
if ( requestContains(requestPath, item.unencodedURL) ) {
return true;
}
}
return false;
}
private List<CustomMenuItem> thisAndChildren() {
List<CustomMenuItem> items = new ArrayList<CustomMenuItem>();
List<CustomMenuItem> items = new ArrayList<>();
items.add(this);
items.addAll(children);
for (CustomMenuItem child : children) {
items.addAll(child.children);
}
return items;
}
@ -167,14 +168,12 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
}
private static IGlobalViewEntryPoints findGlobalViewEntryPoints() {
return (IGlobalViewEntryPoints) getSpringContext().getBean(
"globalView", IGlobalViewEntryPoints.class);
return getSpringContext().getBean("globalView", IGlobalViewEntryPoints.class);
}
private static WebApplicationContext getSpringContext() {
Execution current = Executions.getCurrent();
HttpServletRequest request = (HttpServletRequest) current
.getNativeRequest();
HttpServletRequest request = (HttpServletRequest) current.getNativeRequest();
ServletContext context = request.getSession().getServletContext();
return WebApplicationContextUtils.getWebApplicationContext(context);
@ -185,7 +184,7 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
private IGlobalViewEntryPoints globalView;
public CustomMenuController() {
this.firstLevel = new ArrayList<CustomMenuItem>();
this.firstLevel = new ArrayList<>();
this.globalView = findGlobalViewEntryPoints();
initializeMenu();
activateCurrentOne();
@ -193,28 +192,38 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
}
private void activateCurrentOne() {
String requestPath = Executions.getCurrent().getDesktop()
.getRequestPath();
String requestPath = Executions.getCurrent().getDesktop().getRequestPath();
for (CustomMenuItem ci : this.firstLevel) {
if (ci.contains(requestPath)) {
if ( ci.contains(requestPath) ) {
ci.setActive(true);
for (CustomMenuItem child : ci.children) {
if (child.contains(requestPath)) {
if ( child.contains(requestPath) ) {
child.setActive(true);
for (CustomMenuItem c : child.children) {
if (c.contains(requestPath)) {
if ( c.contains(requestPath) ) {
c.setActive(true);
return;
}
}
return;
}
}
return;
}
}
if (requestPath.isEmpty()) {
return;
}
}
if ( requestPath.isEmpty() ) {
CustomMenuItem item = this.firstLevel.get(0);
item.setActive(true);
item.children.get(0).setActive(true);
@ -225,27 +234,26 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
return OnZKDesktopRegistry.getLocatorFor(IMenuItemsRegister.class);
}
private CustomMenuController topItem(String name, String url,
String helpUri, Collection<? extends CustomMenuItem> items) {
return topItem(name, url, helpUri,
items.toArray(new CustomMenuItem[items.size()]));
private CustomMenuController topItem(String name, String url, String helpUri,
Collection<? extends CustomMenuItem> items) {
return topItem(name, url, helpUri, items.toArray(new CustomMenuItem[items.size()]));
}
private CustomMenuController topItem(String name, String url,
String helpUri,
CustomMenuItem... items) {
private CustomMenuController topItem(String name, String url, String helpUri, CustomMenuItem... items) {
return topItem(name, url, helpUri, false, items);
}
private CustomMenuController topItem(String name, String url,
String helpLink,
boolean disabled, CustomMenuItem... items) {
private CustomMenuController topItem(String name, String url, String helpLink, boolean disabled,
CustomMenuItem... items) {
CustomMenuItem parent = new CustomMenuItem(name, url, disabled);
parent.setHelpLink(helpLink);
this.firstLevel.add(parent);
for (CustomMenuItem child : items) {
parent.appendChildren(child);
}
return this;
}
@ -253,296 +261,316 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
return new CustomMenuItem(name, url, helpLink);
}
private CustomMenuItem subItem(String name, ICapture urlCapture,
String helpLink) {
return new CustomMenuItem(name, EntryPointsHandler.capturePath(urlCapture),
helpLink);
private CustomMenuItem subItem(String name, ICapture urlCapture, String helpLink) {
return new CustomMenuItem(name, EntryPointsHandler.capturePath(urlCapture), helpLink);
}
public void initializeMenu() {
List<CustomMenuItem> planningItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isSuperuserOrRolePlanningOrHasAnyAuthorization()) {
planningItems.add(subItem(_("Company view"), new ICapture() {
List<CustomMenuItem> planningItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrRolePlanningOrHasAnyAuthorization() ) {
planningItems.add(
subItem(
_("Company view"),
new ICapture() {
@Override
public void capture() {
globalView.goToCompanyScheduling();
}
}, "01-introducion.html"));
planningItems.add(subItem(_("Projects"), new ICapture() {
},
"01-introducion.html"));
planningItems.add(subItem(
_("Projects"),
new ICapture() {
@Override
public void capture() {
globalView.goToOrdersList();
}
}, "01-introducion.html#id2"));
},
"01-introducion.html#id2"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PLANNING)) {
planningItems.add(subItem(_("Resources Load"), new ICapture() {
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PLANNING) ) {
planningItems.add(subItem(
_("Resources Load"),
new ICapture() {
@Override
public void capture() {
globalView.goToCompanyLoad();
}
}, "01-introducion.html#id1"));
planningItems.add(subItem(_("Queue-based Resources"), new ICapture() {
},
"01-introducion.html#id1"));
planningItems.add(subItem(
_("Queue-based Resources"),
new ICapture() {
@Override
public void capture() {
globalView.goToLimitingResources();
}
}, "01-introducion.html"));
},
"01-introducion.html"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TEMPLATES)) {
planningItems.add(subItem(_("Templates"),
"/templates/templates.zul", ""));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TEMPLATES) ) {
planningItems.add(subItem(_("Templates"), "/templates/templates.zul", ""));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_IMPORT_PROJECTS)) {
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_IMPORT_PROJECTS) ) {
// In order of see the Import project option in the menu
planningItems.add(subItem(_("Import project"),
"/orders/imports/projectImport.zul", ""));
planningItems.add(subItem(_("Import project"), "/orders/imports/projectImport.zul", ""));
}
//TODO There is some problem here!
/*planningItems.add(subItem(_("Logs"), new ICapture() {
@Override
public void capture() {
globalView.goToLogs();
}
}, "01-asd"));*/
if (!planningItems.isEmpty()) {
if ( !planningItems.isEmpty() ) {
topItem(_("Planning"), "/planner/index.zul", "", planningItems);
}
List<CustomMenuItem> resourcesItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_WORKERS)) {
resourcesItems.add(subItem(_("Workers"),
List<CustomMenuItem> resourcesItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_WORKERS) ) {
resourcesItems.add(subItem(
_("Workers"),
"/resources/worker/worker.zul",
"05-recursos.html#xesti-n-de-traballadores"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MACHINES)) {
resourcesItems.add(subItem(_("Machines"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MACHINES) ) {
resourcesItems.add(subItem(
_("Machines"),
"/resources/machine/machines.zul",
"05-recursos.html#xesti-n-de-m-quinas"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_VIRTUAL_WORKERS)) {
resourcesItems.add(subItem(_("Virtual Workers"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_VIRTUAL_WORKERS) ) {
resourcesItems.add(subItem(
_("Virtual Workers"),
"/resources/worker/virtualWorkers.zul",
"05-recursos.html#xesti-n-de-traballadores"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_CALENDARS)) {
resourcesItems.add(subItem(_("Calendars"),
"/calendars/calendars.zul", "03-calendarios.html"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_CALENDARS) ) {
resourcesItems.add(subItem(_("Calendars"), "/calendars/calendars.zul", "03-calendarios.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_CALENDAR_EXCEPTION_DAYS)) {
resourcesItems.add(subItem(_("Calendar Exception Days"),
"/excetiondays/exceptionDays.zul", ""));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_CALENDAR_EXCEPTION_DAYS) ) {
resourcesItems.add(subItem(_("Calendar Exception Days"), "/excetiondays/exceptionDays.zul", ""));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_CRITERIA)) {
resourcesItems.add(subItem(_("Criteria"),
"/resources/criterions/criterions.zul",
"02-criterios.html#id1"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_CRITERIA) ) {
resourcesItems.add(subItem(_("Criteria"), "/resources/criterions/criterions.zul", "02-criterios.html#id1"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_PROGRESS_TYPES)) {
resourcesItems.add(subItem(_("Progress Types"),
"/advance/advanceTypes.zul", "04-avances.html#id1"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PROGRESS_TYPES) ) {
resourcesItems.add(subItem(_("Progress Types"), "/advance/advanceTypes.zul", "04-avances.html#id1"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_LABELS)) {
resourcesItems.add(subItem(_("Labels"), "/labels/labelTypes.zul",
"10-etiquetas.html"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_LABELS) ) {
resourcesItems.add(subItem(_("Labels"), "/labels/labelTypes.zul", "10-etiquetas.html"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIALS)) {
resourcesItems.add(subItem(_("Materials"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIALS) ) {
resourcesItems.add(subItem(
_("Materials"),
"/materials/materials.zul",
"11-materiales.html#administraci-n-de-materiais"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIAL_UNITS)) {
resourcesItems.add(subItem(_("Material Units"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIAL_UNITS) ) {
resourcesItems.add(subItem(
_("Material Units"),
"/unittypes/unitTypes.zul",
"11-materiales.html#administraci-n-de-materiais"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_QUALITY_FORMS)) {
resourcesItems
.add(subItem(_("Quality Forms"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_QUALITY_FORMS) ) {
resourcesItems.add(subItem(
_("Quality Forms"),
"/qualityforms/qualityForms.zul",
"12-formularios-calidad.html#administraci-n-de-formularios-de-calidade"));
}
if (!resourcesItems.isEmpty()) {
topItem(_("Resources"), "/resources/worker/worker.zul", "",
resourcesItems);
if ( !resourcesItems.isEmpty() ) {
topItem(_("Resources"), "/resources/worker/worker.zul", "", resourcesItems);
}
List<CustomMenuItem> costItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEETS)) {
costItems.add(subItem(_("Timesheets"),
"/workreports/workReport.zul", "09-partes.html#id3"));
List<CustomMenuItem> costItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEETS) ) {
costItems.add(subItem(_("Timesheets"), "/workreports/workReport.zul", "09-partes.html#id3"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEETS_TEMPLATES)) {
costItems.add(subItem(_("Timesheets Templates"),
"/workreports/workReportTypes.zul", "09-partes.html#id2"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEETS_TEMPLATES) ) {
costItems.add(subItem(
_("Timesheets Templates"),
"/workreports/workReportTypes.zul",
"09-partes.html#id2"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEET_LINES_LIST)) {
costItems.add(subItem(_("Timesheet Lines List"),
"/workreports/workReportQuery.zul", "09-partes.html#id4"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TIMESHEET_LINES_LIST) ) {
costItems.add(subItem(
_("Timesheet Lines List"),
"/workreports/workReportQuery.zul",
"09-partes.html#id4"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EXPENSES)) {
costItems.add(subItem(_("Expenses"),
"/expensesheet/expenseSheet.zul", ""));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EXPENSES) ) {
costItems.add(subItem(_("Expenses"), "/expensesheet/expenseSheet.zul", ""));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_COST_CATEGORIES)) {
costItems.add(subItem(_("Cost Categories"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_COST_CATEGORIES) ) {
costItems.add(subItem(
_("Cost Categories"),
"/costcategories/costCategory.zul",
"14-custos.html#categor-as-de-custo"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_HOURS_TYPES)) {
costItems.add(subItem(_("Hours Types"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_HOURS_TYPES) ) {
costItems.add(subItem(
_("Hours Types"),
"/typeofworkhours/typeOfWorkHours.zul",
"14-custos.html#administraci-n-de-horas-traballadas"));
}
if (!costItems.isEmpty()) {
if ( !costItems.isEmpty() ) {
topItem(_("Cost"), "/workreports/workReport.zul", "", costItems);
}
List<CustomMenuItem> configurationItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MAIN_SETTINGS)) {
configurationItems
.add(subItem(_("Main Settings"),
List<CustomMenuItem> configurationItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MAIN_SETTINGS) ) {
configurationItems.add(subItem(
_("Main Settings"),
"/common/configuration.zul",
"16-ldap-authentication.html"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_USER_ACCOUNTS)) {
configurationItems.add(subItem(_("User Accounts"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_USER_ACCOUNTS) ) {
configurationItems.add(subItem(
_("User Accounts"),
"/users/users.zul",
"13-usuarios.html#administraci-n-de-usuarios"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PROFILES)) {
configurationItems.add(subItem(_("Profiles"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PROFILES) ) {
configurationItems.add(subItem(
_("Profiles"),
"/profiles/profiles.zul",
"13-usuarios.html#administraci-n-de-perfiles"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_JOB_SCHEDULING)) {
configurationItems.add(subItem(_("Job Scheduling"),
"/common/job_scheduling.zul",
"19-scheduler.html"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_JOB_SCHEDULING) ) {
configurationItems.add(subItem(_("Job Scheduling"), "/common/job_scheduling.zul", "19-scheduler.html"));
}
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EDIT_EMAIL_TEMPLATES)) {
configurationItems.add(subItem(_("Edit E-mail Templates"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EDIT_EMAIL_TEMPLATES) ) {
configurationItems.add(subItem(
_("Edit E-mail Templates"),
"/email/email_templates.zul",
"email-templates.html"));
}
if (!configurationItems.isEmpty()) {
topItem(_("Configuration"), "/common/configuration.zul", "",
configurationItems);
if ( !configurationItems.isEmpty() ) {
topItem(_("Configuration"), "/common/configuration.zul", "", configurationItems);
}
List<CustomMenuItem> communicationsItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_COMPANIES)) {
communicationsItems.add(subItem(_("Companies"),
"/externalcompanies/externalcompanies.zul", ""));
List<CustomMenuItem> communicationsItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_COMPANIES) ) {
communicationsItems.add(subItem(_("Companies"), "/externalcompanies/externalcompanies.zul", ""));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_SEND_TO_SUBCONTRACTORS)) {
communicationsItems.add(subItem(_("Send To Subcontractors"),
"/subcontract/subcontractedTasks.zul", ""));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_SEND_TO_SUBCONTRACTORS) ) {
communicationsItems.add(subItem(_("Send To Subcontractors"), "/subcontract/subcontractedTasks.zul", ""));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_RECEIVED_FROM_SUBCONTRACTORS)) {
communicationsItems.add(subItem(_("Received From Subcontractors"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_RECEIVED_FROM_SUBCONTRACTORS) ) {
communicationsItems.add(subItem(
_("Received From Subcontractors"),
"/subcontract/subcontractorCommunications.zul", ""));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_SEND_TO_CUSTOMERS)) {
communicationsItems.add(subItem(_("Send To Customers"),
"/subcontract/reportAdvances.zul", ""));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_RECEIVED_FROM_CUSTOMERS)) {
communicationsItems.add(subItem(_("Received From Customers"),
"/subcontract/customerCommunications.zul", ""));
}
if (!communicationsItems.isEmpty()) {
topItem(_("Communications"),
"/externalcompanies/externalcompanies.zul", "",
communicationsItems);
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_SEND_TO_CUSTOMERS) ) {
communicationsItems.add(subItem(_("Send To Customers"), "/subcontract/reportAdvances.zul", ""));
}
List<CustomMenuItem> reportsItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_HOURS_WORKED_PER_RESOURCE_REPORT)) {
reportsItems.add(subItem(_("Hours Worked Per Resource"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_RECEIVED_FROM_CUSTOMERS) ) {
communicationsItems.add(subItem(
_("Received From Customers"),
"/subcontract/customerCommunications.zul", ""));
}
if ( !communicationsItems.isEmpty() ) {
topItem(_("Communications"), "/externalcompanies/externalcompanies.zul", "", communicationsItems);
}
List<CustomMenuItem> reportsItems = new ArrayList<>();
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_HOURS_WORKED_PER_RESOURCE_REPORT) ) {
reportsItems.add(subItem(
_("Hours Worked Per Resource"),
"/reports/hoursWorkedPerWorkerReport.zul",
"15-1-report-hours-worked-by-resource.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_TOTAL_WORKED_HOURS_BY_RESOURCE_IN_A_MONTH_REPORT)) {
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TOTAL_WORKED_HOURS_BY_RESOURCE_IN_A_MONTH_REPORT) ) {
reportsItems.add(subItem(
_("Total Worked Hours By Resource In A Month"),
"/reports/hoursWorkedPerWorkerInAMonthReport.zul",
"15-2-total-hours-by-resource-month.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_WORK_AND_PROGRESS_PER_PROJECT_REPORT)) {
reportsItems.add(subItem(_("Work And Progress Per Project"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_WORK_AND_PROGRESS_PER_PROJECT_REPORT) ) {
reportsItems.add(subItem(
_("Work And Progress Per Project"),
"/reports/schedulingProgressPerOrderReport.zul",
"15-3-work-progress-per-project.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_WORK_AND_PROGRESS_PER_TASK_REPORT)) {
reportsItems.add(subItem(_("Work And Progress Per Task"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_WORK_AND_PROGRESS_PER_TASK_REPORT) ) {
reportsItems.add(subItem(
_("Work And Progress Per Task"),
"/reports/workingProgressPerTaskReport.zul",
"15-informes.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_ESTIMATED_PLANNED_HOURS_PER_TASK_REPORT)) {
reportsItems.add(subItem(_("Estimated/Planned Hours Per Task"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_ESTIMATED_PLANNED_HOURS_PER_TASK_REPORT) ) {
reportsItems.add(subItem(
_("Estimated/Planned Hours Per Task"),
"/reports/completedEstimatedHoursPerTask.zul",
"15-informes.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_PROJECT_COSTS_REPORT)) {
reportsItems.add(subItem(_("Project Costs"),
"/reports/orderCostsPerResource.zul", "15-informes.html"));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PROJECT_COSTS_REPORT) ) {
reportsItems.add(subItem(_("Project Costs"), "/reports/orderCostsPerResource.zul", "15-informes.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT)) {
reportsItems.add(subItem(_("Task Scheduling Status In Project"),
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT) ) {
reportsItems.add(subItem(
_("Task Scheduling Status In Project"),
"/reports/workingArrangementsPerOrderReport.zul",
"15-informes.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIALS_NEED_AT_DATE_REPORT)) {
reportsItems.add(subItem(_("Materials Needed At Date"),
"/reports/timeLineMaterialReport.zul", "15-informes.html"));
}
if (SecurityUtils
.isSuperuserOrUserInRoles(UserRole.ROLE_PROJECT_STATUS_REPORT)) {
reportsItems.add(subItem(_("Project Status"),
"/reports/projectStatusReport.zul", "15-informes.html"));
}
if (!reportsItems.isEmpty()) {
topItem(_("Reports"), "/reports/hoursWorkedPerWorkerReport.zul",
"", reportsItems);
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_MATERIALS_NEED_AT_DATE_REPORT) ) {
reportsItems.add(subItem(
_("Materials Needed At Date"),
"/reports/timeLineMaterialReport.zul",
"15-informes.html"));
}
List<CustomMenuItem> personalAreaItems = new ArrayList<CustomMenuItem>();
if (SecurityUtils.isUserInRole(UserRole.ROLE_BOUND_USER)) {
personalAreaItems.add(subItem(_("Home"),
"/myaccount/userDashboard.zul", ""));
if ( SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_PROJECT_STATUS_REPORT) ) {
reportsItems.add(subItem(_("Project Status"), "/reports/projectStatusReport.zul", "15-informes.html"));
}
personalAreaItems.add(subItem(_("Preferences"),
"/myaccount/settings.zul", ""));
personalAreaItems.add(subItem(_("Change Password"),
"/myaccount/changePassword.zul", ""));
topItem(_("Personal area"), "/myaccount/userDashboard.zul", "",
personalAreaItems);
if ( !reportsItems.isEmpty() ) {
topItem(_("Reports"), "/reports/hoursWorkedPerWorkerReport.zul", "", reportsItems);
}
List<CustomMenuItem> personalAreaItems = new ArrayList<>();
if ( SecurityUtils.isUserInRole(UserRole.ROLE_BOUND_USER) ) {
personalAreaItems.add(subItem(_("Home"), "/myaccount/userDashboard.zul", ""));
}
personalAreaItems.add(subItem(_("Preferences"), "/myaccount/settings.zul", ""));
personalAreaItems.add(subItem(_("Change Password"), "/myaccount/changePassword.zul", ""));
topItem(_("Personal area"), "/myaccount/userDashboard.zul", "", personalAreaItems);
}
private Vbox getRegisteredItemsInsertionPoint() {
@ -554,16 +582,25 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
}
public List<CustomMenuItem> getBreadcrumbsPath() {
List<CustomMenuItem> breadcrumbsPath = new ArrayList<CustomMenuItem>();
List<CustomMenuItem> breadcrumbsPath = new ArrayList<>();
for (CustomMenuItem ci : this.firstLevel) {
if (ci.isActiveParent()) {
if ((ci.name != null) && (ci.name != _("Planning"))) {
if ( ci.isActiveParent() ) {
if ( (ci.name != null) && (ci.name != _("Planning")) ) {
breadcrumbsPath.add(ci);
for (CustomMenuItem child : ci.children) {
if (child.isActiveParent()) {
if ( child.isActiveParent() ) {
breadcrumbsPath.add(child);
for (CustomMenuItem c : child.children) {
if (c.isActiveParent()) {
if ( c.isActiveParent() ) {
breadcrumbsPath.add(c);
}
}
@ -572,53 +609,60 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
}
}
}
return breadcrumbsPath;
}
public String getHelpLink() {
String helpLink = "index.html";
for (CustomMenuItem ci : this.firstLevel) {
if (ci.isActiveParent()) {
if ((ci.name != null)) {
if ( ci.isActiveParent() ) {
if ( (ci.name != null) ) {
for (CustomMenuItem child : ci.children) {
if (child.isActiveParent()
&& !child.helpLink.equals("")) {
if ( child.isActiveParent() && !child.helpLink.equals("") ) {
helpLink = child.helpLink;
}
}
}
}
}
return helpLink;
}
public List<CustomMenuItem> getCustomMenuSecondaryItems() {
for (CustomMenuItem ci : this.firstLevel) {
if (ci.isActiveParent()) {
if ( ci.isActiveParent() ) {
return ci.getChildren();
}
}
return Collections.<CustomMenuItem> emptyList();
return Collections.emptyList();
}
private Button currentOne = null;
@Override
public Object addMenuItem(String name, String cssClass,
org.zkoss.zk.ui.event.EventListener eventListener) {
public Object addMenuItem(String name, String cssClass, org.zkoss.zk.ui.event.EventListener eventListener) {
Vbox insertionPoint = getRegisteredItemsInsertionPoint();
Button button = new Button();
button.setLabel(_(name));
if (cssClass != null) {
if ( cssClass != null ) {
toggleDomainCssClass(cssClass, button);
}
setDeselectedClass(button);
button.addEventListener(Events.ON_CLICK, doNotCallTwice(button,
eventListener));
button.addEventListener(Events.ON_CLICK, doNotCallTwice(button, eventListener));
button.setMold("trendy");
insertionPoint.appendChild(button);
insertionPoint.appendChild(separator());
return button;
}
@ -631,20 +675,22 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
public void renameMenuItem(Object key, String name, String cssClass) {
Button button = (Button) key;
button.setLabel(name);
if (cssClass != null) {
if ( cssClass != null ) {
toggleDomainCssClass(cssClass, button);
}
}
private void toggleDomainCssClass(String cssClass, Button button) {
Matcher matcher = perspectiveCssClass
.matcher(button.getSclass() == null ? "" : button.getSclass());
Matcher matcher = perspectiveCssClass.matcher(button.getSclass() == null ? "" : button.getSclass());
String previousPerspectiveClass;
if (matcher.find()) {
if ( matcher.find() ) {
previousPerspectiveClass = matcher.group();
} else {
previousPerspectiveClass = "";
}
button.setSclass(previousPerspectiveClass + " " + cssClass);
}
@ -663,23 +709,19 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
togglePerspectiveClassTo(button, "perspective");
}
private static final Pattern perspectiveCssClass = Pattern
.compile("\\bperspective(-\\w+)?\\b");
private static final Pattern perspectiveCssClass = Pattern.compile("\\bperspective(-\\w+)?\\b");
private void togglePerspectiveClassTo(final Button button,
String newPerspectiveClass) {
button
.setSclass(togglePerspectiveCssClass(newPerspectiveClass,
button));
private void togglePerspectiveClassTo(final Button button, String newPerspectiveClass) {
button.setSclass(togglePerspectiveCssClass(newPerspectiveClass, button));
}
private String togglePerspectiveCssClass(String newPerspectiveClass,
Button button) {
private String togglePerspectiveCssClass(String newPerspectiveClass, Button button) {
String sclass = button.getSclass();
if (!perspectiveCssClass.matcher(sclass).find()) {
if ( !perspectiveCssClass.matcher(sclass).find() ) {
return newPerspectiveClass + " " + sclass;
} else {
Matcher matcher = perspectiveCssClass.matcher(sclass);
return matcher.replaceAll(newPerspectiveClass);
}
}
@ -690,9 +732,10 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
@Override
public void onEvent(Event event) throws Exception {
if (currentOne == button) {
if ( currentOne == button ) {
return;
}
switchCurrentButtonTo(button);
originalListener.onEvent(event);
}
@ -710,10 +753,10 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
}
private void switchCurrentButtonTo(final Button button) {
if (currentOne == button) {
if ( currentOne == button ) {
return;
}
if (currentOne != null) {
if ( currentOne != null ) {
setDeselectedClass(currentOne);
}
setSelectClass(button);

View file

@ -73,62 +73,70 @@ public class QueuesState {
private final Map<Long, LimitingResourceQueue> queuesByResourceId;
private static <T extends BaseEntity> Map<Long, T> byId(
Collection<? extends T> entities) {
Map<Long, T> result = new HashMap<Long, T>();
private static <T extends BaseEntity> Map<Long, T> byId(Collection<? extends T> entities) {
Map<Long, T> result = new HashMap<>();
for (T each : entities) {
result.put(each.getId(), each);
}
return result;
}
private static Map<Long, LimitingResourceQueue> byResourceId(
Collection<? extends LimitingResourceQueue> limitingResourceQueues) {
Map<Long, LimitingResourceQueue> result = new HashMap<Long, LimitingResourceQueue>();
Map<Long, LimitingResourceQueue> result = new HashMap<>();
for (LimitingResourceQueue each : limitingResourceQueues) {
result.put(each.getResource().getId(), each);
}
return result;
}
public QueuesState(
List<LimitingResourceQueue> limitingResourceQueues,
List<LimitingResourceQueueElement> unassignedLimitingResourceQueueElements) {
this.queues = new ArrayList<LimitingResourceQueue>(
limitingResourceQueues);
this.unassignedElements = new ArrayList<LimitingResourceQueueElement>(
unassignedLimitingResourceQueueElements);
this.queues = new ArrayList<>(limitingResourceQueues);
this.unassignedElements = new ArrayList<>(unassignedLimitingResourceQueueElements);
this.queuesById = byId(queues);
this.elementsById = byId(allElements(limitingResourceQueues,
unassignedLimitingResourceQueueElements));
this.elementsById = byId(allElements(limitingResourceQueues, unassignedLimitingResourceQueueElements));
this.queuesByResourceId = byResourceId(limitingResourceQueues);
this.graph = buildGraph(getAllElements(unassignedElements, queues));
}
private static DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> buildGraph(
List<LimitingResourceQueueElement> allElements) {
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result = instantiateDirectedGraph();
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result =
instantiateDirectedGraph();
for (LimitingResourceQueueElement each : allElements) {
result.addVertex(each);
}
for (LimitingResourceQueueElement each : allElements) {
Set<LimitingResourceQueueDependency> dependenciesAsOrigin = each
.getDependenciesAsOrigin();
Set<LimitingResourceQueueDependency> dependenciesAsOrigin = each.getDependenciesAsOrigin();
for (LimitingResourceQueueDependency eachDependency : dependenciesAsOrigin) {
addDependency(result, eachDependency);
}
}
return result;
}
private static SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> instantiateDirectedGraph() {
return new SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency>(
LimitingResourceQueueDependency.class);
private static SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency>
instantiateDirectedGraph() {
return new SimpleDirectedGraph<>(LimitingResourceQueueDependency.class);
}
private static void addDependency(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result,
DirectedGraph<LimitingResourceQueueElement,
LimitingResourceQueueDependency> result,
LimitingResourceQueueDependency dependency) {
LimitingResourceQueueElement origin = dependency.getHasAsOrigin();
LimitingResourceQueueElement destination = dependency.getHasAsDestiny();
result.addVertex(origin);
@ -139,22 +147,27 @@ public class QueuesState {
private static List<LimitingResourceQueueElement> getAllElements(
List<LimitingResourceQueueElement> unassigned,
List<LimitingResourceQueue> queues) {
List<LimitingResourceQueueElement> result = new ArrayList<LimitingResourceQueueElement>();
List<LimitingResourceQueueElement> result = new ArrayList<>();
result.addAll(unassigned);
for (LimitingResourceQueue each : queues) {
result.addAll(each.getLimitingResourceQueueElements());
}
return result;
}
private List<LimitingResourceQueueElement> allElements(
List<LimitingResourceQueue> queues,
List<LimitingResourceQueueElement> unassigned) {
List<LimitingResourceQueueElement> result = new ArrayList<LimitingResourceQueueElement>();
List<LimitingResourceQueueElement> result = new ArrayList<>();
for (LimitingResourceQueue each : queues) {
result.addAll(each.getLimitingResourceQueueElements());
}
result.addAll(unassigned);
return result;
}
@ -163,26 +176,26 @@ public class QueuesState {
}
public ArrayList<LimitingResourceQueue> getQueuesOrderedByResourceName() {
ArrayList<LimitingResourceQueue> result = new ArrayList<LimitingResourceQueue>(
queues);
ArrayList<LimitingResourceQueue> result = new ArrayList<>(queues);
Collections.sort(result, new Comparator<LimitingResourceQueue>() {
@Override
public int compare(LimitingResourceQueue arg0,
LimitingResourceQueue arg1) {
public int compare(LimitingResourceQueue arg0, LimitingResourceQueue arg1) {
if ((arg0 == null) || (arg0.getResource().getName() == null)) {
if ( (arg0 == null) || (arg0.getResource().getName() == null) ) {
return -1;
}
if ((arg1 == null) || (arg1.getResource().getName() == null)) {
if ( (arg1 == null) || (arg1.getResource().getName() == null) ) {
return 1;
}
return (arg0.getResource().getName().toLowerCase()
.compareTo(arg1.getResource().getName().toLowerCase()));
}
});
return result;
}
@ -191,8 +204,7 @@ public class QueuesState {
return Collections.unmodifiableList(unassignedElements);
}
public void assignedToQueue(LimitingResourceQueueElement element,
LimitingResourceQueue queue) {
public void assignedToQueue(LimitingResourceQueueElement element, LimitingResourceQueue queue) {
Validate.isTrue(unassignedElements.contains(element));
queue.addLimitingResourceQueueElement(element);
unassignedElements.remove(element);
@ -202,15 +214,15 @@ public class QueuesState {
return queuesById.get(queue.getId());
}
public LimitingResourceQueueElement getEquivalent(
LimitingResourceQueueElement element) {
public LimitingResourceQueueElement getEquivalent(LimitingResourceQueueElement element) {
return elementsById.get(element.getId());
}
public void unassingFromQueue(LimitingResourceQueueElement externalElement) {
LimitingResourceQueueElement queueElement = getEquivalent(externalElement);
LimitingResourceQueue queue = queueElement.getLimitingResourceQueue();
if (queue != null) {
if ( queue != null ) {
queue.removeLimitingResourceQueueElement(queueElement);
unassignedElements.add(queueElement);
}
@ -220,20 +232,19 @@ public class QueuesState {
unassignedElements.remove(queueElement);
}
public List<LimitingResourceQueue> getAssignableQueues(
LimitingResourceQueueElement element) {
final ResourceAllocation<?> resourceAllocation = element
.getResourceAllocation();
if (resourceAllocation instanceof SpecificResourceAllocation) {
LimitingResourceQueue queue = getQueueFor(element
.getResource());
public List<LimitingResourceQueue> getAssignableQueues(LimitingResourceQueueElement element) {
final ResourceAllocation<?> resourceAllocation = element.getResourceAllocation();
if ( resourceAllocation instanceof SpecificResourceAllocation ) {
LimitingResourceQueue queue = getQueueFor(element.getResource());
Validate.notNull(queue);
return Collections.singletonList(queue);
} else if (resourceAllocation instanceof GenericResourceAllocation) {
final GenericResourceAllocation generic = (GenericResourceAllocation) element
.getResourceAllocation();
} else if ( resourceAllocation instanceof GenericResourceAllocation ) {
final GenericResourceAllocation generic = (GenericResourceAllocation) element.getResourceAllocation();
return findQueuesMatchingCriteria(generic);
}
throw new RuntimeException("unexpected type of: " + resourceAllocation);
}
@ -241,34 +252,33 @@ public class QueuesState {
return queuesByResourceId.get(resource.getId());
}
public InsertionRequirements getRequirementsFor(
LimitingResourceQueueElement element) {
List<LimitingResourceQueueDependency> dependenciesStart = new ArrayList<LimitingResourceQueueDependency>();
List<LimitingResourceQueueDependency> dependenciesEnd = new ArrayList<LimitingResourceQueueDependency>();
public InsertionRequirements getRequirementsFor(LimitingResourceQueueElement element) {
List<LimitingResourceQueueDependency> dependenciesStart = new ArrayList<>();
List<LimitingResourceQueueDependency> dependenciesEnd = new ArrayList<>();
fillIncoming(element, dependenciesStart, dependenciesEnd);
return InsertionRequirements.forElement(getEquivalent(element),
dependenciesStart, dependenciesEnd);
return InsertionRequirements.forElement(getEquivalent(element), dependenciesStart, dependenciesEnd);
}
public InsertionRequirements getRequirementsFor(
LimitingResourceQueueElement element, DateAndHour startAt) {
List<LimitingResourceQueueDependency> dependenciesStart = new ArrayList<LimitingResourceQueueDependency>();
List<LimitingResourceQueueDependency> dependenciesEnd = new ArrayList<LimitingResourceQueueDependency>();
public InsertionRequirements getRequirementsFor(LimitingResourceQueueElement element, DateAndHour startAt) {
List<LimitingResourceQueueDependency> dependenciesStart = new ArrayList<>();
List<LimitingResourceQueueDependency> dependenciesEnd = new ArrayList<>();
fillIncoming(element, dependenciesStart, dependenciesEnd);
return InsertionRequirements.forElement(getEquivalent(element),
dependenciesStart, dependenciesEnd, startAt);
return InsertionRequirements.forElement(getEquivalent(element), dependenciesStart, dependenciesEnd, startAt);
}
private void fillIncoming(LimitingResourceQueueElement element,
List<LimitingResourceQueueDependency> dependenciesStart,
List<LimitingResourceQueueDependency> dependenciesEnd) {
Set<LimitingResourceQueueDependency> incoming = graph
.incomingEdgesOf(element);
Set<LimitingResourceQueueDependency> incoming = graph.incomingEdgesOf(element);
for (LimitingResourceQueueDependency each : incoming) {
List<LimitingResourceQueueDependency> addingTo = each
.modifiesDestinationStart() ? dependenciesStart
: dependenciesEnd;
if (each.isOriginNotDetached()) {
List<LimitingResourceQueueDependency> addingTo =
each.modifiesDestinationStart() ? dependenciesStart : dependenciesEnd;
if ( each.isOriginNotDetached() ) {
addingTo.add(each);
} else {
fillIncoming(each, addingTo);
@ -276,13 +286,14 @@ public class QueuesState {
}
}
private void fillIncoming(LimitingResourceQueueDependency next,
List<LimitingResourceQueueDependency> result) {
Set<LimitingResourceQueueDependency> incoming = graph
.incomingEdgesOf(next.getHasAsOrigin());
private void fillIncoming(LimitingResourceQueueDependency next, List<LimitingResourceQueueDependency> result) {
Set<LimitingResourceQueueDependency> incoming = graph.incomingEdgesOf(next.getHasAsOrigin());
for (LimitingResourceQueueDependency each : incoming) {
if (each.propagatesThrough(next)) {
if (each.isOriginNotDetached()) {
if ( each.propagatesThrough(next) ) {
if ( each.isOriginNotDetached() ) {
result.add(each);
} else {
fillIncoming(each, result);
@ -295,36 +306,36 @@ public class QueuesState {
* @return all the gaps that could potentially fit <code>element</code>
* ordered by start date
*/
public List<GapOnQueue> getPotentiallyValidGapsFor(
InsertionRequirements requirements) {
List<LimitingResourceQueue> assignableQueues = getAssignableQueues(requirements
.getElement());
public List<GapOnQueue> getPotentiallyValidGapsFor(InsertionRequirements requirements) {
List<LimitingResourceQueue> assignableQueues = getAssignableQueues(requirements.getElement());
List<List<GapOnQueue>> allGaps = gapsFor(assignableQueues, requirements);
return GapsMergeSort.sort(allGaps);
}
private List<List<GapOnQueue>> gapsFor(
List<LimitingResourceQueue> assignableQueues,
private List<List<GapOnQueue>> gapsFor(List<LimitingResourceQueue> assignableQueues,
InsertionRequirements requirements) {
List<List<GapOnQueue>> result = new ArrayList<List<GapOnQueue>>();
List<List<GapOnQueue>> result = new ArrayList<>();
for (LimitingResourceQueue each : assignableQueues) {
result.add(each.getGapsPotentiallyValidFor(requirements));
}
return result;
}
private List<LimitingResourceQueue> findQueuesMatchingCriteria(GenericResourceAllocation generic) {
List<LimitingResourceQueue> result = new ArrayList<LimitingResourceQueue>();
List<LimitingResourceQueue> result = new ArrayList<>();
ResourceEnum resourceType = generic.getResourceType();
Set<Criterion> criteria = generic.getCriterions();
for (LimitingResourceQueue each : queues) {
Resource resource = each.getResource();
if (resource.getType().equals(resourceType)
&& resource.satisfiesCriterionsAtSomePoint(criteria)) {
if ( resource.getType().equals(resourceType) && resource.satisfiesCriterionsAtSomePoint(criteria) ) {
result.add(each);
}
}
return result;
}
@ -336,19 +347,19 @@ public class QueuesState {
public final QueueDependencyType type;
public static Edge from(LimitingResourceQueueDependency dependency) {
return new Edge(dependency.getHasAsOrigin(),
dependency.getHasAsDestiny(), dependency.getType());
return new Edge(dependency.getHasAsOrigin(), dependency.getHasAsDestiny(), dependency.getType());
}
public static Edge insertionOrder(
LimitingResourceQueueElement element,
public static Edge insertionOrder(LimitingResourceQueueElement element,
LimitingResourceQueueElement contiguousNext) {
return new Edge(element, contiguousNext,
QueueDependencyType.END_START);
return new Edge(element, contiguousNext, QueueDependencyType.END_START);
}
private Edge(LimitingResourceQueueElement source,
LimitingResourceQueueElement target, QueueDependencyType type) {
LimitingResourceQueueElement target,
QueueDependencyType type) {
Validate.notNull(source);
Validate.notNull(target);
Validate.notNull(type);
@ -359,18 +370,20 @@ public class QueuesState {
@Override
public int hashCode() {
return new HashCodeBuilder().append(source).append(target)
.append(type).toHashCode();
return new HashCodeBuilder().append(source).append(target).append(type).toHashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Edge) {
if ( obj instanceof Edge ) {
Edge another = (Edge) obj;
return new EqualsBuilder().append(source, another.source)
return new EqualsBuilder()
.append(source, another.source)
.append(target, another.target)
.append(type, another.type).isEquals();
}
return false;
}
@ -378,36 +391,41 @@ public class QueuesState {
public DirectedGraph<LimitingResourceQueueElement, Edge> getPotentiallyAffectedByInsertion(
LimitingResourceQueueElement element) {
DirectedMultigraph<LimitingResourceQueueElement, Edge> result;
result = asEdges(onQueues(buildOutgoingGraphFor(getEquivalent(element))));
Map<LimitingResourceQueue, LimitingResourceQueueElement> earliestForEachQueue = earliest(byQueue(result
.vertexSet()));
for (Entry<LimitingResourceQueue, LimitingResourceQueueElement> each : earliestForEachQueue
.entrySet()) {
Map<LimitingResourceQueue, LimitingResourceQueueElement> earliestForEachQueue =
earliest(byQueue(result.vertexSet()));
for (Entry<LimitingResourceQueue, LimitingResourceQueueElement> each : earliestForEachQueue.entrySet()) {
LimitingResourceQueue queue = each.getKey();
LimitingResourceQueueElement earliest = each.getValue();
addInsertionOrderOnQueueEdges(result, earliest,
queue.getElementsAfter(earliest));
addInsertionOrderOnQueueEdges(result, earliest, queue.getElementsAfter(earliest));
}
return result;
}
private DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> onQueues(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> graph) {
SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result;
result = instantiateDirectedGraph();
for (LimitingResourceQueueDependency each : graph.edgeSet()) {
if (!each.getHasAsOrigin().isDetached()
&& !each.getHasAsDestiny().isDetached()) {
if ( !each.getHasAsOrigin().isDetached() && !each.getHasAsDestiny().isDetached() ) {
addDependency(result, each);
}
}
return result;
}
private DirectedMultigraph<LimitingResourceQueueElement, Edge> asEdges(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> graph) {
DirectedMultigraph<LimitingResourceQueueElement, Edge> result = instantiateMultiGraph();
for (LimitingResourceQueueDependency each : graph.edgeSet()) {
Edge edge = Edge.from(each);
@ -415,48 +433,53 @@ public class QueuesState {
result.addVertex(edge.target);
result.addEdge(edge.source, edge.target, edge);
}
return result;
}
private DirectedMultigraph<LimitingResourceQueueElement, Edge> instantiateMultiGraph() {
return new DirectedMultigraph<LimitingResourceQueueElement, Edge>(
Edge.class);
return new DirectedMultigraph<>(Edge.class);
}
private Map<LimitingResourceQueue, List<LimitingResourceQueueElement>> byQueue(
Collection<? extends LimitingResourceQueueElement> vertexSet) {
Map<LimitingResourceQueue, List<LimitingResourceQueueElement>> result = new HashMap<LimitingResourceQueue, List<LimitingResourceQueueElement>>();
Map<LimitingResourceQueue, List<LimitingResourceQueueElement>> result = new HashMap<>();
for (LimitingResourceQueueElement each : vertexSet) {
assert each.getLimitingResourceQueue() != null;
forQueue(result, each.getLimitingResourceQueue()).add(each);
}
return result;
}
private List<LimitingResourceQueueElement> forQueue(
Map<LimitingResourceQueue, List<LimitingResourceQueueElement>> map,
LimitingResourceQueue queue) {
List<LimitingResourceQueueElement> result = map.get(queue);
if (result == null) {
result = new ArrayList<LimitingResourceQueueElement>();
if ( result == null ) {
result = new ArrayList<>();
map.put(queue, result);
}
return result;
}
private static Map<LimitingResourceQueue, LimitingResourceQueueElement> earliest(
Map<LimitingResourceQueue, List<LimitingResourceQueueElement>> byQueue) {
Map<LimitingResourceQueue, LimitingResourceQueueElement> result = new HashMap<LimitingResourceQueue, LimitingResourceQueueElement>();
for (Entry<LimitingResourceQueue, List<LimitingResourceQueueElement>> each : byQueue
.entrySet()) {
Map<LimitingResourceQueue, LimitingResourceQueueElement> result = new HashMap<>();
for (Entry<LimitingResourceQueue, List<LimitingResourceQueueElement>> each : byQueue.entrySet()) {
result.put(each.getKey(), earliest(each.getValue()));
}
return result;
}
private static LimitingResourceQueueElement earliest(
List<LimitingResourceQueueElement> list) {
private static LimitingResourceQueueElement earliest(List<LimitingResourceQueueElement> list) {
Validate.isTrue(!list.isEmpty());
return Collections.min(list, LimitingResourceQueueElement.byStartTimeComparator());
}
@ -464,16 +487,17 @@ public class QueuesState {
DirectedGraph<LimitingResourceQueueElement, Edge> result,
LimitingResourceQueueElement first,
List<LimitingResourceQueueElement> elements) {
LimitingResourceQueueElement previous = first;
for (LimitingResourceQueueElement each : elements) {
// FIXME: Fixs bug #553, "No such vertex in graph". It seems that
// , for some reason, some of the vertexs (queue elements) are not in graph
// at this point
if (!result.containsVertex(previous)) {
// Fixes bug #553, "No such vertex in graph".
// It seems that, for some reason, some of the vertexes (queue elements) are not in graph at this point
if ( !result.containsVertex(previous) ) {
result.addVertex(previous);
}
if (!result.containsVertex(each)) {
if ( !result.containsVertex(each) ) {
result.addVertex(each);
}
@ -490,32 +514,45 @@ public class QueuesState {
*/
public List<LimitingResourceQueueElement> getInsertionsToBeDoneFor(
LimitingResourceQueueElement externalQueueElement) {
LimitingResourceQueueElement queueElement = getEquivalent(externalQueueElement);
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> subGraph = buildOutgoingGraphFor(queueElement);
CycleDetector<LimitingResourceQueueElement, LimitingResourceQueueDependency> cycleDetector = cycleDetector(subGraph);
if (cycleDetector.detectCycles()) {
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> subGraph =
buildOutgoingGraphFor(queueElement);
CycleDetector<LimitingResourceQueueElement, LimitingResourceQueueDependency> cycleDetector =
cycleDetector(subGraph);
if ( cycleDetector.detectCycles() ) {
throw new IllegalStateException("subgraph has cycles");
}
List<LimitingResourceQueueElement> result = new ArrayList<LimitingResourceQueueElement>();
List<LimitingResourceQueueElement> result = new ArrayList<>();
result.add(queueElement);
result.addAll(getElementsOrderedTopologically(subGraph));
unassignFromQueues(result);
return result;
}
private DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> buildOutgoingGraphFor(
LimitingResourceQueueElement queueElement) {
SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result = instantiateDirectedGraph();
SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result =
instantiateDirectedGraph();
buildOutgoingGraphFor(result, queueElement);
return result;
}
private void buildOutgoingGraphFor(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result,
LimitingResourceQueueElement element) {
Set<LimitingResourceQueueDependency> outgoingEdgesOf = graph
.outgoingEdgesOf(element);
Set<LimitingResourceQueueDependency> outgoingEdgesOf = graph.outgoingEdgesOf(element);
result.addVertex(element);
for (LimitingResourceQueueDependency each : outgoingEdgesOf) {
addDependency(result, each);
buildOutgoingGraphFor(result, each.getHasAsDestiny());
@ -524,18 +561,18 @@ public class QueuesState {
private CycleDetector<LimitingResourceQueueElement, LimitingResourceQueueDependency> cycleDetector(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> subGraph) {
return new CycleDetector<LimitingResourceQueueElement, LimitingResourceQueueDependency>(
subGraph);
return new CycleDetector<>(subGraph);
}
private List<LimitingResourceQueueElement> getElementsOrderedTopologically(
DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> subGraph) {
return onlyAssigned(toList(topologicalIterator(subGraph)));
}
public static <V, E> TopologicalOrderIterator<V, E> topologicalIterator(
DirectedGraph<V, E> subGraph) {
return new TopologicalOrderIterator<V, E>(subGraph);
public static <V, E> TopologicalOrderIterator<V, E> topologicalIterator(DirectedGraph<V, E> subGraph) {
return new TopologicalOrderIterator<>(subGraph);
}
public static <T> List<T> toList(final Iterator<T> iterator) {
@ -543,23 +580,24 @@ public class QueuesState {
while (iterator.hasNext()) {
result.add(iterator.next());
}
return result;
}
private List<LimitingResourceQueueElement> onlyAssigned(
List<LimitingResourceQueueElement> list) {
List<LimitingResourceQueueElement> result = new ArrayList<LimitingResourceQueueElement>();
private List<LimitingResourceQueueElement> onlyAssigned(List<LimitingResourceQueueElement> list) {
List<LimitingResourceQueueElement> result = new ArrayList<>();
for (LimitingResourceQueueElement each : list) {
if (!each.isDetached()) {
if ( !each.isDetached() ) {
result.add(each);
}
}
return result;
}
private void unassignFromQueues(List<LimitingResourceQueueElement> result) {
for (LimitingResourceQueueElement each : result) {
if (!each.isDetached()) {
if ( !each.isDetached() ) {
unassingFromQueue(each);
}
}
@ -569,13 +607,13 @@ public class QueuesState {
LimitingResourceQueueElement oldElement,
LimitingResourceQueueElement newElement) {
if (oldElement.isNewObject()) {
if ( oldElement.isNewObject() ) {
elementsById.put(oldElement.getId(), oldElement);
}
LimitingResourceQueueElement element = getEquivalent(oldElement);
if (element.hasDayAssignments()) {
if ( element.hasDayAssignments() ) {
unassingFromQueue(element);
}
@ -586,17 +624,18 @@ public class QueuesState {
unassignedElements.add(newElement);
elementsById.put(newElement.getId(), newElement);
graph.addVertex(newElement);
for (LimitingResourceQueueDependency each: newElement.getDependenciesAsOrigin()) {
graph.addEdge(each.getHasAsOrigin(), each.getHasAsDestiny(), each);
}
for (LimitingResourceQueueDependency each: newElement.getDependenciesAsDestiny()) {
graph.addEdge(each.getHasAsOrigin(), each.getHasAsDestiny(), each);
}
}
public void idChangedFor(Long previousId,
LimitingResourceQueueElement element) {
public void idChangedFor(Long previousId, LimitingResourceQueueElement element) {
elementsById.remove(previousId);
elementsById.put(element.getId(), element);
}
@ -613,21 +652,25 @@ public class QueuesState {
*/
private DirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> buildSubgraphFor(
List<LimitingResourceQueueElement> queueElements) {
SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result = instantiateDirectedGraph();
SimpleDirectedGraph<LimitingResourceQueueElement, LimitingResourceQueueDependency> result =
instantiateDirectedGraph();
// Iterate through elements and construct graph
for (LimitingResourceQueueElement each : queueElements) {
result.addVertex(each);
for (LimitingResourceQueueDependency dependency : each
.getDependenciesAsOrigin()) {
LimitingResourceQueueElement destiny = dependency
.getHasAsDestiny();
if (queueElements.contains(destiny)) {
for (LimitingResourceQueueDependency dependency : each.getDependenciesAsOrigin()) {
LimitingResourceQueueElement destiny = dependency.getHasAsDestiny();
if ( queueElements.contains(destiny) ) {
// Add source, destiny and edge between them
addDependency(result, dependency);
}
}
}
return result;
}
@ -644,30 +687,34 @@ public class QueuesState {
*/
public List<GapOnQueueWithQueueElement> getGapsWithQueueElementsOnQueueSince(
LimitingResourceQueue queue, DateAndHour allocationTime) {
return gapsWithQueueElementsFor(queue, allocationTime);
}
private List<GapOnQueueWithQueueElement> gapsWithQueueElementsFor(
LimitingResourceQueue queue, DateAndHour allocationTime) {
List<GapOnQueueWithQueueElement> result = new ArrayList<GapOnQueueWithQueueElement>();
List<GapOnQueueWithQueueElement> result = new ArrayList<>();
DateAndHour previousEnd = null;
for (LimitingResourceQueueElement each : queue
.getLimitingResourceQueueElements()) {
for (LimitingResourceQueueElement each : queue.getLimitingResourceQueueElements()) {
DateAndHour startTime = each.getStartTime();
if (!startTime.isBefore(allocationTime)) {
if (previousEnd == null || startTime.isAfter(previousEnd)) {
Gap gap = Gap.create(queue.getResource(), previousEnd,
startTime);
result.add(GapOnQueueWithQueueElement.create(
gap.onQueue(queue), each));
if ( !startTime.isBefore(allocationTime) ) {
if ( previousEnd == null || startTime.isAfter(previousEnd) ) {
Gap gap = Gap.create(queue.getResource(), previousEnd, startTime);
result.add(GapOnQueueWithQueueElement.create(gap.onQueue(queue), each));
}
}
previousEnd = each.getEndTime();
}
Gap gap = Gap.create(queue.getResource(), previousEnd, null);
result.add(GapOnQueueWithQueueElement.create(gap.onQueue(queue), null));
return result;
}

View file

@ -68,8 +68,12 @@ import org.springframework.transaction.annotation.Transactional;
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE,
WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE,
@ContextConfiguration(locations = {
BUSINESS_SPRING_CONFIG_FILE,
WEBAPP_SPRING_CONFIG_FILE,
WEBAPP_SPRING_CONFIG_TEST_FILE,
WEBAPP_SPRING_SECURITY_CONFIG_FILE,
WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE })
public class SubcontractServiceTest {
@ -106,14 +110,12 @@ public class SubcontractServiceTest {
OrderLineDTO orderLineDTO = new OrderLineDTO();
orderLineDTO.name = "Test";
orderLineDTO.code = orderLineCode;
orderLineDTO.initDate = DateConverter
.toXMLGregorianCalendar(new Date());
orderLineDTO.initDate = DateConverter.toXMLGregorianCalendar(new Date());
return orderLineDTO;
}
private ExternalCompany getClientExternalCompanySaved(String name,
String nif) {
private ExternalCompany getClientExternalCompanySaved(String name, String nif) {
ExternalCompany externalCompany = ExternalCompany.create(name, nif);
externalCompany.setClient(true);
@ -147,8 +149,9 @@ public class SubcontractServiceTest {
SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
subcontractedTaskDataDTO.orderElementDTO = orderElementDTO;
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = subcontractService
.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList =
subcontractService.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
assertThat(instanceConstraintViolationsList.size(), equalTo(1));
assertThat(orderDAO.getOrders().size(), equalTo(previous));
@ -159,14 +162,14 @@ public class SubcontractServiceTest {
public void invalidSubcontractedTaskDataWithoutOrderElement() {
int previous = orderDAO.getOrders().size();
ExternalCompany externalCompany = getClientExternalCompanySaved(
"Company", "company-nif");
ExternalCompany externalCompany = getClientExternalCompanySaved("Company", "company-nif");
SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
subcontractedTaskDataDTO.externalCompanyNif = externalCompany.getNif();
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = subcontractService
.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList =
subcontractService.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
assertThat(instanceConstraintViolationsList.size(), equalTo(1));
assertThat(orderDAO.getOrders().size(), equalTo(previous));
@ -180,8 +183,7 @@ public class SubcontractServiceTest {
String orderLineCode = "order-line-code";
OrderElementDTO orderElementDTO = givenBasicOrderLineDTO(orderLineCode);
ExternalCompany externalCompany = getClientExternalCompanySaved(
"Company", "company-nif");
ExternalCompany externalCompany = getClientExternalCompanySaved("Company", "company-nif");
SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
subcontractedTaskDataDTO.orderElementDTO = orderElementDTO;
@ -194,8 +196,9 @@ public class SubcontractServiceTest {
subcontractedTaskDataDTO.subcontractedCode = orderCustomerReference;
subcontractedTaskDataDTO.subcontractPrice = orderBudget;
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = subcontractService
.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList =
subcontractService.subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
assertThat(instanceConstraintViolationsList.size(), equalTo(0));
assertThat(orderDAO.getOrders().size(), equalTo(previous + 1));
@ -205,14 +208,11 @@ public class SubcontractServiceTest {
assertTrue(order.isCodeAutogenerated());
assertNotNull(order.getExternalCode());
assertThat(order.getExternalCode(), equalTo(orderLineCode));
assertThat(order.getState(),
equalTo(OrderStatusEnum.OUTSOURCED));
assertThat(order.getState(), equalTo(OrderStatusEnum.OUTSOURCED));
assertThat(order.getWorkHours(), equalTo(0));
assertThat(order.getCustomer().getId(),
equalTo(externalCompany.getId()));
assertThat(order.getCustomer().getId(), equalTo(externalCompany.getId()));
assertThat(order.getName(), equalTo(orderName));
assertThat(order.getCustomerReference(),
equalTo(orderCustomerReference));
assertThat(order.getCustomerReference(), equalTo(orderCustomerReference));
assertThat(order.getTotalManualBudget(), equalTo(orderBudget));
List<OrderElement> children = order.getChildren();

View file

@ -461,8 +461,8 @@
<!-- JGraphT -->
<dependency>
<groupId>org.jgrapht</groupId>
<artifactId>jgrapht-jdk1.5</artifactId>
<version>0.7.3</version>
<artifactId>jgrapht-core</artifactId>
<version>0.9.2</version>
</dependency>
<!-- Jfreechart -->