Skip to content

Commit 758e08f

Browse files
committed
update BagIt creation processes to include a timestamp for creation, modify and access time metadata in files in the bag
1 parent a2dec7a commit 758e08f

File tree

7 files changed

+55
-18
lines changed

7 files changed

+55
-18
lines changed

pom.xml

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<!-- DuraCloud Version Information (supported version of DuraCloud) -->
2121
<duracloud.version>8.1.0</duracloud.version>
2222
<!-- DuraSpace BagIt Support Library -->
23-
<bagit-support.version>1.1.0</bagit-support.version>
23+
<bagit-support.version>1.2.0</bagit-support.version>
2424
<jaxb-api.version>4.0.2</jaxb-api.version>
2525
<jaxb-runtime.version>4.0.5</jaxb-runtime.version>
2626
<!-- Replication Task Suite requires Java 17 because DSpace 8 requires it -->
@@ -260,21 +260,25 @@
260260
<scope>provided</scope>
261261
<exclusions>
262262
<exclusion>
263-
<groupId>org.slf4j</groupId>
264-
<artifactId>slf4j-log4j12</artifactId>
265-
</exclusion>
266-
<exclusion>
267-
<groupId>log4j</groupId>
268-
<artifactId>log4j</artifactId>
263+
<groupId>commons-io</groupId>
264+
<artifactId>commons-io</artifactId>
269265
</exclusion>
270266
<exclusion>
271267
<groupId>javax.xml.bind</groupId>
272268
<artifactId>jaxb-api</artifactId>
273269
</exclusion>
270+
<exclusion>
271+
<groupId>log4j</groupId>
272+
<artifactId>log4j</artifactId>
273+
</exclusion>
274274
<exclusion>
275275
<groupId>org.glassfish.jaxb</groupId>
276276
<artifactId>jaxb-runtime</artifactId>
277277
</exclusion>
278+
<exclusion>
279+
<groupId>org.slf4j</groupId>
280+
<artifactId>slf4j-log4j12</artifactId>
281+
</exclusion>
278282
</exclusions>
279283
</dependency>
280284
<dependency>
@@ -319,12 +323,12 @@
319323
<dependency>
320324
<groupId>org.apache.logging.log4j</groupId>
321325
<artifactId>log4j-api</artifactId>
322-
<version>2.23.1</version>
326+
<version>2.24.0</version>
323327
</dependency>
324328
<dependency>
325329
<groupId>org.apache.logging.log4j</groupId>
326330
<artifactId>log4j-core</artifactId>
327-
<version>2.23.1</version>
331+
<version>2.24.0</version>
328332
<scope>test</scope>
329333
</dependency>
330334

src/main/java/org/dspace/pack/bagit/BagItAipWriter.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
import java.sql.SQLException;
2424
import java.util.Collections;
2525
import java.util.HashMap;
26+
import java.util.LinkedHashMap;
2627
import java.util.List;
2728
import java.util.Map;
2829
import java.util.concurrent.atomic.AtomicLong;
30+
2931
import jakarta.xml.bind.JAXBContext;
3032
import jakarta.xml.bind.JAXBException;
3133
import jakarta.xml.bind.Marshaller;
@@ -35,6 +37,7 @@
3537
import org.dspace.authorize.AuthorizeException;
3638
import org.dspace.content.Bitstream;
3739
import org.dspace.content.factory.ContentServiceFactory;
40+
import org.dspace.content.Item;
3841
import org.dspace.content.service.BitstreamService;
3942
import org.dspace.core.Context;
4043
import org.dspace.core.Utils;
@@ -53,7 +56,6 @@
5356
import org.joda.time.LocalDate;
5457
import org.joda.time.format.ISODateTimeFormat;
5558

56-
import jakarta.xml.bind.JAXBException;
5759

5860
/**
5961
* The BagItAipWriter handles the packaging of DSpaceObjects into their respective bags. It processes the metadata and
@@ -81,12 +83,14 @@ public class BagItAipWriter {
8183
public static final String TEMPLATE_XML = "template-metadata.xml";
8284
private static final String BITSTREAM_PREFIX = "bitstream_";
8385

86+
protected static final long DEFAULT_MODIFIED_DATE = 1036368000L * 1000;
87+
8488
private final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService();
8589

86-
// Fields used for book keeping
90+
// Fields used for bookkeeping
8791
private final AtomicLong successBytes = new AtomicLong();
8892
private final AtomicLong successFiles = new AtomicLong();
89-
private final Map<File, String> checksums = new HashMap<>();
93+
private final LinkedHashMap<File, String> checksums = new LinkedHashMap<>();
9094

9195
/**
9296
* The context to use
@@ -138,6 +142,11 @@ public class BagItAipWriter {
138142
*/
139143
private List<BagBitstream> bitstreams;
140144

145+
/**
146+
* Last modified time of DSpace object
147+
*/
148+
private Long lastModifiedTime;
149+
141150
/**
142151
* Constructor for a {@link BagItAipWriter}. Takes a minimal set of information needed in order to write an AIP as a
143152
* BagIt bag for dspace consumption.
@@ -153,6 +162,7 @@ public BagItAipWriter(final Context context, final File directory, final String
153162
this.logo = null;
154163
this.policies = null;
155164
this.metadata = null;
165+
this.lastModifiedTime = DEFAULT_MODIFIED_DATE;
156166
this.archFmt = checkNotNull(archFmt);
157167
this.directory = checkNotNull(directory);
158168
this.properties = checkNotNull(properties);
@@ -213,6 +223,15 @@ public BagItAipWriter withBitstreams(final List<BagBitstream> bitstreams) {
213223
return this;
214224
}
215225

226+
/**
227+
* @param lastModifiedTime the {@link Item} to use when writing AIP files
228+
* @return the {@link BagItAipWriter} used for creating the aip
229+
*/
230+
public BagItAipWriter withLastModifiedTime(final long lastModifiedTime) {
231+
this.lastModifiedTime = lastModifiedTime;
232+
return this;
233+
}
234+
216235
/**
217236
* Create a serialized BagIt bag using the parameters the BagItAipWriter was instantiated with
218237
*
@@ -354,7 +373,7 @@ public File packageAip() throws IOException, SQLException, AuthorizeException {
354373
bag.write();
355374

356375
final BagSerializer serializer = SerializationSupport.serializerFor(archFmt, profile);
357-
final Path serializedBag = serializer.serialize(directory.toPath());
376+
final Path serializedBag = serializer.serializeWithTimestamp(directory.toPath(), lastModifiedTime);
358377
delete(directory);
359378

360379
return serializedBag.toFile();

src/main/java/org/dspace/pack/bagit/CollectionPacker.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static org.dspace.pack.PackerFactory.OBJFILE;
1414
import static org.dspace.pack.PackerFactory.OWNER_ID;
1515
import static org.dspace.pack.bagit.BagItAipWriter.BAG_AIP;
16+
import static org.dspace.pack.bagit.BagItAipWriter.DEFAULT_MODIFIED_DATE;
1617
import static org.dspace.pack.bagit.BagItAipWriter.OBJ_TYPE_COLLECTION;
1718
import static org.dspace.pack.bagit.BagItAipWriter.PROPERTIES_DELIMITER;
1819

@@ -143,6 +144,7 @@ public File pack(File packDir) throws AuthorizeException, IOException, SQLExcept
143144
.withMetadata(metadata)
144145
.withItemTemplate(templateMd)
145146
.withDSpaceRoles(dSpaceRoles)
147+
.withLastModifiedTime(DEFAULT_MODIFIED_DATE)
146148
.packageAip();
147149
}
148150

src/main/java/org/dspace/pack/bagit/CommunityPacker.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static org.dspace.pack.PackerFactory.OBJFILE;
1414
import static org.dspace.pack.PackerFactory.OWNER_ID;
1515
import static org.dspace.pack.bagit.BagItAipWriter.BAG_AIP;
16+
import static org.dspace.pack.bagit.BagItAipWriter.DEFAULT_MODIFIED_DATE;
1617
import static org.dspace.pack.bagit.BagItAipWriter.OBJ_TYPE_COMMUNITY;
1718
import static org.dspace.pack.bagit.BagItAipWriter.PROPERTIES_DELIMITER;
1819

@@ -49,8 +50,7 @@
4950
*
5051
* @author richardrodgers
5152
*/
52-
public class CommunityPacker implements Packer
53-
{
53+
public class CommunityPacker implements Packer {
5454
private CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
5555

5656
// NB - these values must remain synchronized with DB schema -
@@ -123,6 +123,7 @@ public File pack(File packDir) throws AuthorizeException, SQLException, IOExcept
123123
.withPolicies(policy)
124124
.withMetadata(metadata)
125125
.withDSpaceRoles(dSpaceRoles)
126+
.withLastModifiedTime(DEFAULT_MODIFIED_DATE)
126127
.packageAip();
127128
}
128129

src/main/java/org/dspace/pack/bagit/ItemPacker.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static org.dspace.pack.PackerFactory.OWNER_ID;
1717
import static org.dspace.pack.PackerFactory.WITHDRAWN;
1818
import static org.dspace.pack.bagit.BagItAipWriter.BAG_AIP;
19+
import static org.dspace.pack.bagit.BagItAipWriter.DEFAULT_MODIFIED_DATE;
1920
import static org.dspace.pack.bagit.BagItAipWriter.OBJ_TYPE_ITEM;
2021
import static org.dspace.pack.bagit.BagItAipWriter.PROPERTIES_DELIMITER;
2122

@@ -94,6 +95,12 @@ public File pack(final File packDir) throws AuthorizeException, IOException, SQL
9495
objectProperties.add(OBJECT_TYPE + PROPERTIES_DELIMITER + OBJ_TYPE_ITEM);
9596
objectProperties.add(OBJECT_ID + PROPERTIES_DELIMITER + item.getHandle());
9697

98+
// Use item's lastModifiedDate when creating the BagIt bag
99+
long lmTime = item.getLastModified().getTime();
100+
if (lmTime <= 0) {
101+
lmTime = DEFAULT_MODIFIED_DATE;
102+
}
103+
97104
final StringBuilder linked = new StringBuilder();
98105
for (Collection coll : item.getCollections()) {
99106
if (itemService.isOwningCollection(item, coll)) {
@@ -120,7 +127,7 @@ public File pack(final File packDir) throws AuthorizeException, IOException, SQL
120127
// policy.xml
121128
final Policies policy = BagItPolicyUtil.getPolicy(context, item);
122129

123-
// proceed to bundles, in sub-directories, filtering
130+
// proceed to bundles, in subdirectories, filtering
124131
final List<BagBitstream> bitstreams = new ArrayList<>();
125132
for (Bundle bundle : item.getBundles()) {
126133
final String bundleName = bundle.getName();
@@ -159,6 +166,7 @@ public File pack(final File packDir) throws AuthorizeException, IOException, SQL
159166
.withPolicies(policy)
160167
.withMetadata(metadata)
161168
.withBitstreams(bitstreams)
169+
.withLastModifiedTime(lmTime)
162170
.packageAip();
163171
}
164172

@@ -308,5 +316,4 @@ public RefFilter(String filter)
308316
url = parts[2];
309317
}
310318
}
311-
312319
}

src/main/java/org/dspace/pack/bagit/SitePacker.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.dspace.pack.PackerFactory.OBJECT_TYPE;
1313
import static org.dspace.pack.PackerFactory.OBJFILE;
1414
import static org.dspace.pack.bagit.BagItAipWriter.BAG_AIP;
15+
import static org.dspace.pack.bagit.BagItAipWriter.DEFAULT_MODIFIED_DATE;
1516
import static org.dspace.pack.bagit.BagItAipWriter.PROPERTIES_DELIMITER;
1617

1718
import java.io.File;
@@ -96,6 +97,7 @@ public File pack(File packDir) throws AuthorizeException, IOException, SQLExcept
9697

9798
return new BagItAipWriter(context, packDir, archFmt, properties)
9899
.withDSpaceRoles(dSpaceRoles)
100+
.withLastModifiedTime(DEFAULT_MODIFIED_DATE)
99101
.packageAip();
100102
}
101103

src/test/java/org/dspace/pack/bagit/BagItAipWriterTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.dspace.pack.bagit;
99

1010
import static org.assertj.core.api.Assertions.assertThat;
11+
import static org.dspace.pack.bagit.BagItAipWriter.DEFAULT_MODIFIED_DATE;
1112
import static org.mockito.ArgumentMatchers.any;
1213
import static org.mockito.ArgumentMatchers.eq;
1314
import static org.mockito.Mockito.times;
@@ -100,7 +101,8 @@ public void testWriteAip() throws Exception {
100101
.withLogo(logo)
101102
.withMetadata(metadata)
102103
.withPolicies(policies)
103-
.withBitstreams(bitstreams);
104+
.withBitstreams(bitstreams)
105+
.withLastModifiedTime(DEFAULT_MODIFIED_DATE);
104106

105107
when(bitstreamService.retrieve(any(Context.class), eq(logo)))
106108
.thenReturn(new ByteArrayInputStream("logo".getBytes()));

0 commit comments

Comments
 (0)