Skip to content

Commit 96407db

Browse files
authored
Merge pull request #6 from sul-dlss/scale-validator
Extract ScaleValidator from IIIFResource
2 parents 848b77d + b4dd169 commit 96407db

File tree

5 files changed

+58
-30
lines changed

5 files changed

+58
-30
lines changed

src/main/java/edu/illinois/library/cantaloupe/resource/iiif/IIIFResource.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -218,31 +218,6 @@ protected final boolean redirectToNormalizedScaleConstraint()
218218
return false;
219219
}
220220

221-
/**
222-
* @param virtualSize Orientation-aware full source image size.
223-
* @param scale May be {@code null}.
224-
* @param invalidStatus Status code to return when the given scale fails
225-
* validation.
226-
*/
227-
protected void validateScale(Dimension virtualSize,
228-
Scale scale,
229-
Status invalidStatus) throws ScaleRestrictedException {
230-
final ScaleConstraint scaleConstraint =
231-
(getMetaIdentifier().getScaleConstraint() != null) ?
232-
getMetaIdentifier().getScaleConstraint() : new ScaleConstraint(1, 1);
233-
double scalePct = scaleConstraint.getRational().doubleValue();
234-
if (scale != null) {
235-
scalePct = Arrays.stream(
236-
scale.getResultingScales(virtualSize, scaleConstraint))
237-
.max().orElse(1);
238-
}
239-
final Configuration config = Configuration.getInstance();
240-
final double maxScale = config.getDouble(Key.MAX_SCALE, 1.0);
241-
if (maxScale > 0.0001 && scalePct > maxScale) {
242-
throw new ScaleRestrictedException(invalidStatus, maxScale);
243-
}
244-
}
245-
246221
protected void setLastModifiedHeader(Instant lastModified) {
247222
getResponse().setHeader("Last-Modified",
248223
DateTimeFormatter.RFC_1123_DATE_TIME
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package edu.illinois.library.cantaloupe.resource.iiif;
2+
3+
import java.util.Arrays;
4+
5+
import edu.illinois.library.cantaloupe.config.Configuration;
6+
import edu.illinois.library.cantaloupe.config.Key;
7+
import edu.illinois.library.cantaloupe.http.Status;
8+
import edu.illinois.library.cantaloupe.image.Dimension;
9+
import edu.illinois.library.cantaloupe.image.MetaIdentifier;
10+
import edu.illinois.library.cantaloupe.image.ScaleConstraint;
11+
import edu.illinois.library.cantaloupe.operation.Scale;
12+
import edu.illinois.library.cantaloupe.resource.ScaleRestrictedException;
13+
14+
/**
15+
* Shared scale validation logic for IIIF.
16+
* Note that there is an additional scale validator contained within v3.ImageResource
17+
*/
18+
public class ScaleValidator {
19+
20+
/**
21+
* @param virtualSize Orientation-aware full source image size.
22+
* @param scale May be {@code null}.
23+
* @param invalidStatus Status code to return when the given scale fails
24+
* validation.
25+
*/
26+
public static void validateScale(Dimension virtualSize,
27+
Scale scale,
28+
Status invalidStatus,
29+
MetaIdentifier metaId) throws ScaleRestrictedException {
30+
final ScaleConstraint scaleConstraint = (metaId.getScaleConstraint() != null) ?
31+
metaId.getScaleConstraint() : new ScaleConstraint(1, 1);
32+
double scalePct = scaleConstraint.getRational().doubleValue();
33+
if (scale != null) {
34+
scalePct = Arrays.stream(
35+
scale.getResultingScales(virtualSize, scaleConstraint))
36+
.max().orElse(1);
37+
}
38+
final Configuration config = Configuration.getInstance();
39+
final double maxScale = config.getDouble(Key.MAX_SCALE, 1.0);
40+
if (maxScale > 0.0001 && scalePct > maxScale) {
41+
throw new ScaleRestrictedException(invalidStatus, maxScale);
42+
}
43+
}
44+
45+
}

src/main/java/edu/illinois/library/cantaloupe/resource/iiif/v1/ImageResource.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import edu.illinois.library.cantaloupe.resource.ImageRequestHandler;
1515
import edu.illinois.library.cantaloupe.source.StatResult;
1616
import edu.illinois.library.cantaloupe.http.ContentTypeNegotiator;
17+
import edu.illinois.library.cantaloupe.resource.iiif.ScaleValidator;
18+
1719
import org.slf4j.Logger;
1820
import org.slf4j.LoggerFactory;
1921

@@ -98,9 +100,10 @@ public void willStreamImageFromDerivativeCache() {
98100
public void willProcessImage(Processor processor,
99101
Info info) throws Exception {
100102
final Dimension fullSize = info.getSize(getPageIndex());
101-
validateScale(info.getMetadata().getOrientation().adjustedSize(fullSize),
103+
ScaleValidator.validateScale(info.getMetadata().getOrientation().adjustedSize(fullSize),
102104
(Scale) opList.getFirst(Scale.class),
103-
Status.FORBIDDEN);
105+
Status.FORBIDDEN,
106+
getMetaIdentifier());
104107

105108
final String disposition = getRepresentationDisposition(
106109
getMetaIdentifier().toString(),

src/main/java/edu/illinois/library/cantaloupe/resource/iiif/v2/ImageResource.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import edu.illinois.library.cantaloupe.resource.ImageRequestHandler;
1818
import edu.illinois.library.cantaloupe.resource.iiif.SizeRestrictedException;
1919
import edu.illinois.library.cantaloupe.source.StatResult;
20+
import edu.illinois.library.cantaloupe.resource.iiif.ScaleValidator;
2021
import org.slf4j.Logger;
2122
import org.slf4j.LoggerFactory;
2223

@@ -122,10 +123,12 @@ public void willProcessImage(Processor processor,
122123
metadata.getOrientation() : Orientation.ROTATE_0;
123124
final Dimension virtualSize = orientation.adjustedSize(info.getSize(pageIndex));
124125
final Dimension resultingSize = ops.getResultingSize(info.getSize());
125-
validateScale(
126+
ScaleValidator.validateScale(
126127
virtualSize,
127128
(Scale) ops.getFirst(Scale.class),
128-
Status.FORBIDDEN);
129+
Status.FORBIDDEN,
130+
getMetaIdentifier());
131+
129132
validateSize(resultingSize, virtualSize);
130133
sendHeaders();
131134
}

src/main/java/edu/illinois/library/cantaloupe/resource/iiif/v3/ImageResource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import edu.illinois.library.cantaloupe.resource.ImageRequestHandler;
2020
import edu.illinois.library.cantaloupe.resource.iiif.SizeRestrictedException;
2121
import edu.illinois.library.cantaloupe.source.StatResult;
22+
import edu.illinois.library.cantaloupe.resource.iiif.ScaleValidator;
23+
2224
import org.slf4j.Logger;
2325
import org.slf4j.LoggerFactory;
2426

@@ -127,7 +129,7 @@ public void willProcessImage(Processor processor,
127129
final Dimension virtualSize = orientation.adjustedSize(info.getSize(pageIndex));
128130
final Dimension resultingSize = ops.getResultingSize(info.getSize(pageIndex));
129131
validateScale(virtualSize, scale, params.getSize().isUpscalingAllowed());
130-
validateScale(virtualSize, scale, Status.BAD_REQUEST);
132+
ScaleValidator.validateScale(virtualSize, scale, Status.BAD_REQUEST, getMetaIdentifier());
131133
validateSize(virtualSize, resultingSize);
132134
sendHeaders();
133135
}

0 commit comments

Comments
 (0)