- task-code (technical, often auto-generated)
+ Total budgeted hours for task
+ Notes (usable for detailed task description)
+ Procentual Progression
+ Filtering: only active tasks (progress < 100%)
+ Filtering: only tasks starting from the last X months to the next Y
months. X and Y are user settings for “ResourcesLoadFilterSince/From”.
+ Tasks sorted by date ascending - seems much more logical than
descending.
Check on task != null before forceLoading a task.
When deploying a newly built Libreplan, this error came up on Tomcat
and Glassfish. It seems to be related to Hibernate 4 not needing
Hibernate Annotations anymore. I have removed two references in the
pom.xml files, and the error was gone, while the application still runs
When deploying a newly built Libreplan, this error came up on Tomcat
and Glassfish. It seems to be related to Hibernate 4 not needing
Hibernate Annotations anymore. I have removed two references in the
pom.xml files, and the error was gone, while the application still runs
smoothly.
This error message came up when deploying Libreplan 1.4.1 from a new
build. It seems to be related to a version mismatch between hibernate
(4.3.4) and annotations (3.5.6-Final). Hibernate 4.3.4 seems not to
need annotations anymore - I have removed this part from the main
pom.xml file, and the errors have disappeared.
Move to a Hibernate version compatible with Jahira. When running with
Java 8 an exception was caused when initializing the session factory.
java.lang.NoSuchMethodError: org.hibernate.engine.jdbc.spi.JdbcServices.getConnectionProvider()Lorg/hibernate/engine/jdbc/connections/spi/ConnectionProvider;
at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.use42Api(AbstractUserTypeHibernateIntegrator.java:80)
Now Libreplan can be run on Java8.
This implied some changes:
* Latest versions of hibernate use the Bean Validation API. This
implied renaming the imports and use ConstraintViolationException
instead of InvalidValue. Besides some constraints had to be renamed,
otherwise they wouldn't be recognized by Hibernate validation. In
the new version of Hibernate validator @AssertTrue can only be
applied to properties. So all methods it was applied to must follow
the is.* format.
Automatic execution of Bean Validation API is disabled, otherwise an
infinite loop would happen. This is because there are some
validation constraints that do launch queries to the database. This
causes a flush of the objects in the session and automatic
validation is called again.
* A new library for persisting JodaTime is necessary since
joda-time-hibernate is incompatible with hibernate 4. This library
can automatically register its types for Date conversion so they're
removed from configuration.
* Now, in some places, an InvalidDataAccessApiUsageException is thrown
instead of a DataIntegrityViolationException.
This is because no constraint is violated, the API is being used
incorrectly because a transient instance is being provided where a
persisted one was expected.
* In hibernate 4 listeners cannot be configured via properties.
HibernateDatabaseModificationsListener registers itself in its @PostConstruct method.
* ehcache classes used are now different.
It's not necessary, the standard strategy redirect to the original URL
and if it's the default one, IndexController will redirect to the user
default location.
A regression was introduced when adding filtering for the WBS screen.
Instead of being associated to the original TreeModel, the tree is
associated to a newly created one based on the current filtering
predicate. So any changes to the original TreeModel aren't
automatically shown in the Tree UI.
A method must be called to associate a new TreeModel, with the new
changes incorporated, to the tree. The method `filterByPredicateIfAny`
implemented this functionality, but it was renamed to
`reloadTreeUIAfterChanges` to convey better its purpose.
Now when adding a new template, `reloadTreeUIAfterChanges` is called
and the newly created element is shown.
When calculating the load ratio of each resource, a new transaction is
being created for each one. Now one transaction is reused for
everyone, which gives a good performance boost when loading the
`Advanced search`.
When opening the `resource allocation modal window` (double-click on a
task), the advanced search was calculating the load of the resources
when it should do it when clicking advanced search button. This leads
to a big delay when opening the `resource allocation modal window` if
there is a moderate amount of data.
Now these calculations are only done when clicking advanced search
button and the `resource allocation modal window` is opened almost
instantly.
A JavaScript string is being generated quoted by the ' character. If
it finds that character in a string inside the evaled JavaScript it
would terminate the string prematurely, causing syntax errors.
When an allocation cannot be done, the error message on the input
disappeared because the rows were re-rendered due to reloadBindings
call. Now this call is avoided and some extracted functionality from
getCurrentRows is called.
It's not strictly necessary since inside the listener is checked that
effortInput is enabled, but for consistency do it the same way as with
effortInput.
The MessagesForUser component is used for showing information and
error messages to the users. It's designed to disappear once the user
does some action and a minimum of time has passed.
This is done listening to the events being produced in the page. In
previous versions of ZK this was enough to identify user activity, but
in the version currently used, 5.0.11, events not related to user
activity are generated. This causes the messages to disappear without
user action.
With this fix, only when the user clicks on something, or changes the
value of some input the shown message is cleared.
Java's Gettext Commons,
http://xnap-commons.sourceforge.net/gettext-commons/, uses
java.text.MessageFormat for doing the parameter substitution.
MessageFormat interprets ' as an escaping character. In order to
introduce ', you have to escape it, i.e., you have to type '' instead.
Otherwise posterior positional parameters like {0} aren't interpreted.
When checking the condition
`isOnlyChildAndParentAlreadyInUseByHoursOrExpenses` the parent might
be a new object. In that case the check if false and no further
querying must be done in the parent.