Skip to content

Commit 24692ed

Browse files
committed
Refacoring, get rid of Date and Calendar
1 parent c961838 commit 24692ed

File tree

8 files changed

+614
-647
lines changed

8 files changed

+614
-647
lines changed

src/main/java/nl/digitalekabeltelevisie/data/mpeg/TransportStream.java

+25-27
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
import static nl.digitalekabeltelevisie.util.Utils.*;
3535

3636
import java.io.*;
37+
import java.time.Instant;
38+
import java.time.LocalDateTime;
39+
import java.time.ZoneId;
40+
import java.time.temporal.ChronoUnit;
3741
import java.util.*;
3842
import java.util.logging.Level;
3943
import java.util.logging.Logger;
@@ -143,7 +147,7 @@ public class TransportStream implements TreeNode{
143147
/**
144148
* time at which this transportStream started. Calculated by calculating backwards from first TDT, using bitrate. null if no TDT found
145149
*/
146-
private Calendar zeroTime;
150+
private LocalDateTime zeroTime;
147151

148152
private final long len;
149153

@@ -904,11 +908,11 @@ private void calculateBitrateTDT() {
904908
TDTsection first = tdtSectionList.getFirst();
905909
TDTsection last = tdtSectionList.getLast();
906910
long diffPacket = (long)last.getPacket_no() - first.getPacket_no();
907-
Calendar utcCalenderLast = getUTCCalender(last.getUTC_time());
908-
Calendar utcCalenderFirst = getUTCCalender(first.getUTC_time());
911+
LocalDateTime utcCalenderLast = getUTCLocalDateTime(last.getUTC_time());
912+
LocalDateTime utcCalenderFirst = getUTCLocalDateTime(first.getUTC_time());
909913
// getUTCCalender might fail if not correct BCD, then will return null.
910914
if((utcCalenderLast!=null)&&(utcCalenderFirst!=null)){
911-
long timeDiffMills = utcCalenderLast.getTimeInMillis()- utcCalenderFirst.getTimeInMillis();
915+
long timeDiffMills = utcCalenderFirst.until(utcCalenderLast, ChronoUnit.MILLIS);
912916
if(timeDiffMills> 0L){ // shit happens... capture.guangdong has 10 with same timestamp....
913917
bitRateTDT = (diffPacket * packetLength * 8 * 1000)/timeDiffMills;
914918
}
@@ -922,11 +926,10 @@ private void calculateZeroTime() {
922926
List<TDTsection> tdtSectionList = psi.getTdt().getTdtSectionList();
923927
if (!tdtSectionList.isEmpty()) {
924928
TDTsection first = tdtSectionList.getFirst();
925-
Calendar firstTime = getUTCCalender(first.getUTC_time());
929+
LocalDateTime firstTime = getUTCLocalDateTime(first.getUTC_time());
926930
if (firstTime != null) {
927931
long millsIntoStream = ((long) first.getPacket_no() * packetLength * 8 * 1000) / getBitRate();
928-
firstTime.add(Calendar.MILLISECOND, (int) -millsIntoStream);
929-
zeroTime = firstTime;
932+
zeroTime = firstTime.minus (millsIntoStream, ChronoUnit.MILLIS);
930933
}
931934
}
932935
}
@@ -1013,33 +1016,34 @@ public String getPacketTime(int packetNo){
10131016
return packetNo + " (packetNo)";
10141017
}
10151018
if (zeroTime == null) {
1016-
Calendar calendar = new GregorianCalendar();
1017-
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
1018-
calendar.setTimeInMillis(0L);
1019-
calendar.add(Calendar.MILLISECOND, getTimeFromStartInMilliSecs(packetNo));
10201019
// return only the hours/min,secs and millisecs. Not TS recording will last days
1021-
return getFormattedTime(calendar);
1020+
1021+
Instant instant = Instant.ofEpochMilli(getTimeFromStartInMilliSecs(packetNo));
1022+
LocalDateTime ldt = instant.atZone(ZoneId.of("Z")).toLocalDateTime();
1023+
return getFormattedTime(ldt);
10221024
}
1023-
Calendar calendar = (Calendar) zeroTime.clone();
10241025
// calculation in long, intermediate results can be > Integer.MAX_VALUE
1026+
LocalDateTime packetTime = zeroTime.plusNanos(1_000_000L * getTimeFromStartInMilliSecs( packetNo));
10251027

1026-
calendar.add(Calendar.MILLISECOND, getTimeFromStartInMilliSecs( packetNo));
1027-
return getFormattedDateTime(calendar);
1028+
return getFormattedDateTime(packetTime);
10281029
}
10291030

10301031
private int getTimeFromStartInMilliSecs(int packetNo) {
1031-
return (int) (((long) packetNo * packetLength * 8 * 1000) / getBitRate());
1032+
// calculation in long, intermediate results can be > Integer.MAX_VALUE
1033+
return (int) ((((long) packetNo) * packetLength * 8 * 1000L) / getBitRate());
10321034
}
10331035

1034-
private static String getFormattedDateTime(Calendar calendar) {
1036+
1037+
private static String getFormattedDateTime(LocalDateTime calendar) {
10351038
return(String.format("%1$tY/%1$tm/%1$td %1$tHh%1$tMm%1$tS:%1$tL", calendar));
10361039
}
10371040

1038-
private static String getFormattedTime(Calendar calendar) {
1041+
private static String getFormattedTime(LocalDateTime calendar) {
10391042

10401043
return(String.format("%1$tHh%1$tMm%1$tS:%1$tL", calendar));
10411044
}
10421045

1046+
10431047
/**
10441048
* TODO the parameter packetNoOrPCR has two different meaning, because BitRateChat and TimeStampChart use different X-axis for aVCHD/DVB Full stream
10451049
* This should be fixed somewhere else ???
@@ -1054,18 +1058,12 @@ public String getShortPacketTime(long packetNoOrPCR){
10541058
}
10551059

10561060
if(getBitRate()!=-1){ //can't calculate time without a bitrate
1057-
Calendar calendar;
10581061
if(zeroTime==null){
1059-
calendar = new GregorianCalendar();
1060-
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
1061-
calendar.setTimeInMillis(0);
1062-
}else{
1063-
calendar = (Calendar)zeroTime.clone();
1062+
Instant instant = Instant.ofEpochMilli(getTimeFromStartInMilliSecs((int)packetNoOrPCR));
1063+
return getFormattedTime(instant.atZone(ZoneId.of("Z")).toLocalDateTime());
10641064
}
1065-
calendar.add(Calendar.MILLISECOND, getTimeFromStartInMilliSecs((int)packetNoOrPCR));
1066-
// return only the hours/min,secs and millisecs. No TS recording will last days
10671065

1068-
return getFormattedTime(calendar);
1066+
return getFormattedTime(zeroTime.plusNanos(1_000_000L * getTimeFromStartInMilliSecs((int) packetNoOrPCR)));
10691067

10701068
} // no bitrate
10711069
return packetNoOrPCR +" (packetNo)";

src/main/java/nl/digitalekabeltelevisie/data/mpeg/psi/EIT.java

+47-54
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* http://www.digitalekabeltelevisie.nl/dvb_inspector
55
*
6-
* This code is Copyright 2009-2022 by Eric Berendsen (e_berendsen@digitalekabeltelevisie.nl)
6+
* This code is Copyright 2009-2024 by Eric Berendsen (e_berendsen@digitalekabeltelevisie.nl)
77
*
88
* This file is part of DVB Inspector.
99
*
@@ -28,20 +28,13 @@
2828

2929
import static nl.digitalekabeltelevisie.data.mpeg.descriptors.Descriptor.findDescriptorApplyListFunc;
3030
import static nl.digitalekabeltelevisie.util.Utils.addListJTree;
31-
import static nl.digitalekabeltelevisie.util.Utils.getDurationMillis;
32-
import static nl.digitalekabeltelevisie.util.Utils.getUTCDate;
31+
import static nl.digitalekabeltelevisie.util.Utils.getDurationSeconds;
3332
import static nl.digitalekabeltelevisie.util.Utils.isUndefined;
3433
import static nl.digitalekabeltelevisie.util.Utils.simpleModus;
3534

36-
import java.util.Arrays;
37-
import java.util.Collection;
38-
import java.util.Date;
39-
import java.util.List;
40-
import java.util.Map;
35+
import java.time.LocalDateTime;
36+
import java.util.*;
4137
import java.util.Map.Entry;
42-
import java.util.Objects;
43-
import java.util.Set;
44-
import java.util.TreeMap;
4538
import java.util.function.IntPredicate;
4639
import java.util.logging.Level;
4740
import java.util.logging.Logger;
@@ -84,16 +77,16 @@ public class EIT extends AbstractPSITabel{
8477
private static final Logger logger = Logger.getLogger(EIT.class.getName());
8578

8679

87-
public EIT(final PSI parent){
80+
public EIT(PSI parent){
8881
super(parent);
8982
}
9083

91-
public void update(final EITsection section){
84+
public void update(EITsection section){
9285

93-
final int original_network_id = section.getOriginalNetworkID();
94-
final int streamId = section.getTransportStreamID();
95-
final int serviceId = section.getServiceID();
96-
final int tableId = section.getTableId();
86+
int original_network_id = section.getOriginalNetworkID();
87+
int streamId = section.getTransportStreamID();
88+
int serviceId = section.getServiceID();
89+
int tableId = section.getTableId();
9790

9891
TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> networkSections = newEit.computeIfAbsent(original_network_id,k -> new TreeMap<>());
9992
TreeMap<Integer, TreeMap<Integer, EITsection[]>> programStreamSections = networkSections.computeIfAbsent(streamId,k -> new TreeMap<>());
@@ -108,51 +101,51 @@ public void update(final EITsection section){
108101
if(tableSectionArray[section.getSectionNumber()]==null){
109102
tableSectionArray[section.getSectionNumber()] = section;
110103
}else{
111-
final TableSection last = tableSectionArray[section.getSectionNumber()];
104+
TableSection last = tableSectionArray[section.getSectionNumber()];
112105
updateSectionVersion(section, last);
113106
}
114107
}
115108

116109
@Override
117-
public DefaultMutableTreeNode getJTreeNode(final int modus) {
110+
public DefaultMutableTreeNode getJTreeNode(int modus) {
118111

119112
// need this KVP at end of loop to set ImageSource
120-
final KVP eitKVP = new KVP("EIT");
121-
final DefaultMutableTreeNode t = new DefaultMutableTreeNode(eitKVP);
113+
KVP eitKVP = new KVP("EIT");
114+
DefaultMutableTreeNode t = new DefaultMutableTreeNode(eitKVP);
122115

123116
Map<ServiceIdentification, EITsection[]> allEitImageMap = new TreeMap<>();
124117

125118
for(Entry<Integer, TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>>> network:newEit.entrySet()) {
126-
final Integer orgNetworkId= network.getKey();
127-
TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> networkSections = network.getValue();
119+
Integer orgNetworkId= network.getKey();
120+
SortedMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> networkSections = network.getValue();
128121

129122
// need this KVP at end of loop to set ImageSource
130-
final KVP networkNodeKVP = new KVP("original_network_id", orgNetworkId,Utils.getOriginalNetworkIDString(orgNetworkId));
131-
final DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode(networkNodeKVP);
123+
KVP networkNodeKVP = new KVP("original_network_id", orgNetworkId,Utils.getOriginalNetworkIDString(orgNetworkId));
124+
DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode(networkNodeKVP);
132125
t.add(networkNode);
133126

134127
Map<ServiceIdentification, EITsection[]> networkImageMap = new TreeMap<>();
135128

136129
for(Entry<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> netWorkSection:networkSections.entrySet()) {
137-
final Integer transport_stream_id = netWorkSection.getKey();
138-
TreeMap<Integer, TreeMap<Integer, EITsection[]>> streams = netWorkSection.getValue();
130+
Integer transport_stream_id = netWorkSection.getKey();
131+
SortedMap<Integer, TreeMap<Integer, EITsection[]>> streams = netWorkSection.getValue();
139132

140133
// need this KVP at end of loop to set ImageSource
141-
final KVP streamNodeKVP = new KVP("transport_stream_id", transport_stream_id,null);
142-
final DefaultMutableTreeNode streamNode = new DefaultMutableTreeNode(streamNodeKVP);
134+
KVP streamNodeKVP = new KVP("transport_stream_id", transport_stream_id,null);
135+
DefaultMutableTreeNode streamNode = new DefaultMutableTreeNode(streamNodeKVP);
143136
networkNode.add(streamNode);
144137

145138
TreeMap<ServiceIdentification, EITsection[]> streamImageMap = new TreeMap<>();
146139

147140
for(Entry<Integer, TreeMap<Integer, EITsection[]>> streamEntry: streams.entrySet()) {
148-
final Integer serviceId = streamEntry.getKey();
149-
TreeMap<Integer, EITsection[]> service = streamEntry.getValue();
141+
Integer serviceId = streamEntry.getKey();
142+
SortedMap<Integer, EITsection[]> service = streamEntry.getValue();
150143

151144
// for EITImage, sections of this service with tableID >80
152145
EITsection[] serviceSections = new EITsection[0];
153146

154-
final KVP serviceNodeKVP = new KVP("service_id", serviceId,getParentPSI().getSdt().getServiceName(orgNetworkId, transport_stream_id, serviceId));
155-
final DefaultMutableTreeNode serviceNode = new DefaultMutableTreeNode(serviceNodeKVP);
147+
KVP serviceNodeKVP = new KVP("service_id", serviceId,getParentPSI().getSdt().getServiceName(orgNetworkId, transport_stream_id, serviceId));
148+
DefaultMutableTreeNode serviceNode = new DefaultMutableTreeNode(serviceNodeKVP);
156149

157150
serviceNodeKVP.addHTMLSource(() -> service.entrySet().
158151
stream().
@@ -172,7 +165,7 @@ public DefaultMutableTreeNode getJTreeNode(final int modus) {
172165
Integer tableId = serviceEntry.getKey();
173166
EITsection[] sections = serviceEntry.getValue();
174167

175-
final KVP tableNodeKVP = new KVP("tableid", tableId,TableSection.getTableType(tableId));
168+
KVP tableNodeKVP = new KVP("tableid", tableId,TableSection.getTableType(tableId));
176169
tableNodeKVP.addHTMLSource(() -> Arrays.stream(sections).
177170
filter(Objects::nonNull).
178171
map(e -> e.getHtmlForEit(modus)).
@@ -181,7 +174,7 @@ public DefaultMutableTreeNode getJTreeNode(final int modus) {
181174
);
182175

183176
tableNodeKVP.addTableSource(()->getTableModel(sections), "Events");
184-
final DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(tableNodeKVP);
177+
DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(tableNodeKVP);
185178
serviceNode.add(tableNode);
186179

187180
if(tableId>=80) {
@@ -191,11 +184,11 @@ public DefaultMutableTreeNode getJTreeNode(final int modus) {
191184

192185
for (EITsection section : sections) {
193186
if(section!= null){
194-
if(!simpleModus(modus)){
195-
addSectionVersionsToJTree(tableNode, section, modus);
196-
}else{
197-
addListJTree(tableNode,section.getEventList(),modus,"events");
198-
}
187+
if (simpleModus(modus)) {
188+
addListJTree(tableNode, section.getEventList(), modus, "events");
189+
} else {
190+
addSectionVersionsToJTree(tableNode, section, modus);
191+
}
199192
}
200193
}
201194
}
@@ -299,28 +292,28 @@ private static EITsection[] appendSections(EITsection[] serviceSections, EITsect
299292
* @param eitTable map of service IDs to EITSection[] Can contain sections from different Table IDs, like 0x50 and 0x51, etc... (for very long EPGs)
300293
* @return Interval that covers all events in eitTable
301294
*/
302-
public static Interval getSpanningInterval(final Set<ServiceIdentification> serviceSet, Map<ServiceIdentification, EITsection[]> eitTable) {
303-
Date startDate = null;
304-
Date endDate = null;
295+
public static Interval getSpanningInterval(Set<ServiceIdentification> serviceSet, Map<ServiceIdentification, EITsection[]> eitTable) {
296+
LocalDateTime startDate = null;
297+
LocalDateTime endDate = null;
305298
// services to be displayed
306299

307-
for(final ServiceIdentification serviceNo : serviceSet){
308-
for(final EITsection section :eitTable.get(serviceNo)){
300+
for(ServiceIdentification serviceNo : serviceSet){
301+
for(EITsection section :eitTable.get(serviceNo)){
309302
if(section!= null){
310303
List<Event> eventList = section.getEventList();
311304
for(Event event:eventList){
312-
final byte[] startTime = event.getStartTime();
305+
byte[] startTime = event.getStartTime();
313306
if(isUndefined(startTime)){ // undefined start time
314307
continue;
315308
}
316-
Date eventStart = getUTCDate( startTime);
317-
if((startDate==null)||(startDate.after(eventStart))){
309+
LocalDateTime eventStart = Utils.getUTCLocalDateTime(startTime);
310+
if((startDate==null)||(startDate.isAfter(eventStart))){
318311
startDate = eventStart;
319312
}
320313
if(eventStart!=null){
321314
try{
322-
Date eventEnd = new Date(eventStart.getTime()+ getDurationMillis(event.getDuration()));
323-
if((endDate==null)||(endDate.before(eventEnd))){
315+
LocalDateTime eventEnd =eventStart.plusSeconds(getDurationSeconds(event.getDuration()));
316+
if((endDate==null)||(endDate.isBefore(eventEnd))){
324317
endDate = eventEnd;
325318
}
326319
}catch(NumberFormatException nfe){
@@ -350,15 +343,15 @@ public Map<ServiceIdentification, EITsection[]> getFlatEit(IntPredicate schedule
350343

351344
for (Entry<Integer, TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>>> networkEntry : newEit.entrySet()) {
352345
int orgNetworkId = networkEntry.getKey();
353-
TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> network = networkEntry.getValue();
346+
SortedMap<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> network = networkEntry.getValue();
354347

355348
for (Entry<Integer, TreeMap<Integer, TreeMap<Integer, EITsection[]>>> streamEntry : network.entrySet()) {
356349
int streamId = streamEntry.getKey();
357-
TreeMap<Integer, TreeMap<Integer, EITsection[]>> stream = streamEntry.getValue();
350+
SortedMap<Integer, TreeMap<Integer, EITsection[]>> stream = streamEntry.getValue();
358351

359352
for (Entry<Integer, TreeMap<Integer, EITsection[]>> serviceEntry : stream.entrySet()) {
360353
int serviceId = serviceEntry.getKey();
361-
TreeMap<Integer, EITsection[]> service = serviceEntry.getValue();
354+
SortedMap<Integer, EITsection[]> service = serviceEntry.getValue();
362355

363356
for (Entry<Integer, EITsection[]> tableEntry : service.entrySet()) {
364357
int tableId = tableEntry.getKey();
@@ -391,7 +384,7 @@ static TableHeader<EITsection, Event> buildEitTableHeader() {
391384

392385
.addOptionalRepeatingRowColumn("rating ", component -> findDescriptorApplyListFunc(
393386
component.getDescriptorList(), ParentalRatingDescriptor.class,
394-
ratingDescriptor -> ratingDescriptor.getRatingList().stream().collect(Collectors.toList())),
387+
ratingDescriptor -> new ArrayList<>(ratingDescriptor.getRatingList())),
395388
ParentalRatingDescriptor.Rating.class)
396389
.build();
397390
}

0 commit comments

Comments
 (0)