Merge pull request #112 from PaulLuchyn/master

Fixed bug with GC overhead
This commit is contained in:
Jeroen Baten 2016-10-26 17:45:23 +02:00 committed by GitHub
commit e13b31248c
4 changed files with 49 additions and 18 deletions

View file

@ -231,6 +231,7 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
new DateTime(new GregorianCalendar(minimumYear, MINIMUM_MONTH, MINIMUM_DAY).getTime());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy");
// Need to call dateFormat.set2DigitYearStart to force parser not to parse date to previous century
simpleDateFormat.set2DigitYearStart(
new GregorianCalendar(CALENDAR_START_YEAR, MINIMUM_MONTH, MINIMUM_DAY).getTime());
@ -250,6 +251,7 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
DateTime correct = new DateTime(value);
String year = Integer.valueOf(correct.getYear()).toString().substring(2);
// TODO Resolve deprecated methods
date = simpleDateFormat
.parse(((Date) value).getMonth() + "/" + ((Date) value).getDate() + "/" + year);
@ -260,7 +262,8 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
else {
try {
date = simpleDateFormat.parse((String) value);
} catch (ParseException ignored) {}
} catch (ParseException ignored) {
}
}
DateTime dateTimeInTextbox = new DateTime(date);

View file

@ -418,10 +418,22 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements ICritical
}
}
/**
* This class is designed for performing topological sorting of nodes.
* Topological sorting is used to make graph nodes not to be mixed, because
* parent and child nodes ({@link TaskPoint}) must be placed in the correct order.
* Also during topological sorting nodes are placed on appropriate levels.
* Topological sorting can be done using different algorithms, but here is used Khan's algorithm.
*/
class TopologicalSorter {
private Map<TaskPoint, Integer> taskPointsByDepthCached = null;
/**
* This method is used to place each node on appropriate level.
*
* @return map of TaskPoints with appropriate levels
*/
private Map<TaskPoint, Integer> taskPointsByDepth() {
if ( taskPointsByDepthCached != null ) {
return taskPointsByDepthCached;
@ -430,27 +442,47 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements ICritical
Map<TaskPoint, Integer> result = new HashMap<>();
Map<TaskPoint, Set<TaskPoint>> visitedBy = new HashMap<>();
/*
* Here are stored taskpoints that we have visited.
* This need to be done because we need to check have we visited this taskpoint, or not.
* Described above need to be done to avoid loop between taskpoints.
*/
Set<TaskPoint> visitedTaskPoints = new HashSet ();
Queue<TaskPoint> withoutIncoming = getInitial(withoutVisibleIncomingDependencies(getTopLevelTasks()));
for (TaskPoint each : withoutIncoming) {
initializeIfNeededForKey(result, each, 0);
}
while (!withoutIncoming.isEmpty()) {
TaskPoint current = withoutIncoming.poll();
visitedTaskPoints.add(current); // Marking taskpoint as visited
// Taking all child elements
for (TaskPoint each : current.getImmediateSuccessors()) {
initializeIfNeededForKey(visitedBy, each, new HashSet<TaskPoint>());
Set<TaskPoint> visitors = visitedBy.get(each);
visitors.add(current);
Set<TaskPoint> predecessorsRequired = each.getImmediatePredecessors();
if (!visitedTaskPoints.contains(each)) {
if ( visitors.containsAll(predecessorsRequired) ) {
initializeIfNeededForKey(result, each, result.get(current) + 1);
withoutIncoming.offer(each);
initializeIfNeededForKey(visitedBy, each, new HashSet<TaskPoint>());
Set<TaskPoint> visitors = visitedBy.get(each);
visitors.add(current);
// Taking parent elements
Set<TaskPoint> predecessorsRequired = each.getImmediatePredecessors();
if ( visitors.containsAll(predecessorsRequired) ) {
initializeIfNeededForKey(result, each, result.get(current) + 1);
withoutIncoming.offer(each);
}
}
}
}
return taskPointsByDepthCached = Collections.unmodifiableMap(result);
}

View file

@ -497,10 +497,6 @@ public abstract class Task implements ITaskFundamentalProperties {
return LocalDate.fromDateFields(getBeginDate().toDayRoundedDate());
}
public LocalDate getEndDateAsLocalDate() {
return LocalDate.fromDateFields(getEndDate().toDayRoundedDate());
}
@Override
public boolean isManualAnyAllocation() {
return fundamentalProperties.isManualAnyAllocation();

View file

@ -246,17 +246,17 @@ msgstr ""
msgid "Show critical path"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:240
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:247
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:271
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:278
msgid "The date you entered is invalid"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:241
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:248
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:272
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:279
msgid "Please enter date not before"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:242
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:249
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:273
#: ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java:280
msgid "and no later than"
msgstr ""