CtxRequestHandler.java
6.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.scene7.is.provider.DebugInfoEnum
* com.scene7.is.provider.ProcessingStatus
* com.scene7.is.provider.RequestTypeEnum
* com.scene7.is.provider.Response
* com.scene7.is.provider.ResponseData
* com.scene7.is.provider.TextResponseGenerator
* com.scene7.is.provider.TextResponseTypeEnum
* com.scene7.is.sleng.CacheEnum
* com.scene7.is.sleng.FXGServer
* com.scene7.is.sleng.ImageAccessException
* com.scene7.is.sleng.ImageServer
* com.scene7.is.sleng.SlengPrinter
* com.scene7.is.util.DigestAdler32
* com.scene7.is.util.MimeTypeEnum
* com.scene7.is.util.SizeInt
* com.scene7.is.util.TextEncodingTypeEnum
* com.scene7.is.util.XMLUtil
* com.scene7.is.util.text.ParameterException
* org.jetbrains.annotations.NotNull
*/
package com.scene7.is.ps.provider;
import com.scene7.is.provider.DebugInfoEnum;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.TextResponseGenerator;
import com.scene7.is.provider.TextResponseTypeEnum;
import com.scene7.is.ps.provider.IZoomException;
import com.scene7.is.ps.provider.ModifierSet;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.RequestHandler;
import com.scene7.is.ps.provider.Util;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.ps.provider.fvctx.FvctxImageProps;
import com.scene7.is.ps.provider.fvctx.FvctxImagePropsBuilder;
import com.scene7.is.ps.provider.fvctx.FvctxImagePropsBuilderImpl;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.SlengPrinter;
import com.scene7.is.util.DigestAdler32;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.SizeInt;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.XMLUtil;
import com.scene7.is.util.text.ParameterException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Properties;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
class CtxRequestHandler
implements RequestHandler {
private static final String PROTOCOL_VERSION = "3.0";
@NotNull
private final FvctxImagePropsBuilder imagePropsBuilder;
CtxRequestHandler(@NotNull ImageServer server, @NotNull FXGServer fxgServer) {
this.imagePropsBuilder = new FvctxImagePropsBuilderImpl(server, fxgServer);
}
@NotNull
@Override
public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws ImageAccessException, ParameterException, IZoomException {
if (parsedRequest.getDebugInfo() == DebugInfoEnum.SLENG) {
RequestTypeEnum requestType = parsedRequest.getType();
FvctxImageProps imageProps = this.buildImageProps(parsedRequest);
String slengText = SlengPrinter.decompileCode((byte[])imageProps.getSleng());
return new Response().setData(ResponseData.createResponseMessage((String)slengText, (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setRequestType(requestType);
}
return this.getContext(parsedRequest);
}
@NotNull
private Response getContext(@NotNull Request request) throws ParameterException, ImageAccessException, IZoomException {
FvctxImageProps imageProps = this.buildImageProps(request);
String imageVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateImageDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
String metadataVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateMetaDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
ResponseData data = TextResponseTypeEnum.XML == request.getResponseType() ? CtxRequestHandler.generateXml(request, imageProps, imageVersion, metadataVersion) : CtxRequestHandler.generateProps(request, imageProps, imageVersion, metadataVersion);
long expires = Util.computeNonImgExpiration(request);
return new Response().setData(data).setExpiration(expires).setClientCacheUse(CacheEnum.ON).setRequestType(request.getType());
}
@NotNull
private FvctxImageProps buildImageProps(@NotNull Request request) throws ParameterException, IZoomException, ImageAccessException {
return this.imagePropsBuilder.buildImageProps(request, false);
}
@NotNull
private static ResponseData generateXml(@NotNull Request request, @NotNull FvctxImageProps imageProps, @NotNull String imageVersion, @NotNull String metadataVersion) {
Document doc = XMLUtil.createDocument();
Element root = XMLUtil.createElement((Document)doc, (String)"ctx");
root.setAttribute("iv", imageVersion);
root.setAttribute("mv", metadataVersion);
root.setAttribute("dx", String.valueOf(imageProps.getSize().width));
root.setAttribute("dy", String.valueOf(imageProps.getSize().height));
root.setAttribute("pv", "3.0");
doc.appendChild(root);
return ResponseData.createResponseMessage((String)XMLUtil.toXMLString((Document)doc, (TextEncodingTypeEnum)request.getResponseEncoding(), (boolean)false), (TextEncodingTypeEnum)request.getResponseEncoding(), (MimeTypeEnum)request.getResponseType().getMimeType());
}
@NotNull
private static ResponseData generateProps(@NotNull Request request, @NotNull FvctxImageProps imageProps, @NotNull String imageVersion, @NotNull String metadataVersion) {
ModifierSet attr = request.getGlobalAttributes();
String urlId = CtxRequestHandler.generateUrlId(attr, imageVersion);
String jsonId = attr.get(ModifierEnum.ID, "");
String jsonHandler = attr.get(ModifierEnum.HANDLER, "");
Properties props = new Properties();
props.setProperty("context.id", urlId);
props.setProperty("image.rect", "0,0," + imageProps.getSize().width + ',' + imageProps.getSize().height);
props.setProperty("protocol.version", "3.0");
props.setProperty("image.version", imageVersion);
props.setProperty("metadata.version", metadataVersion);
return ResponseData.createResponseData((byte[])TextResponseGenerator.generate((Properties)props, (TextResponseTypeEnum)request.getResponseType(), (String)jsonId, (String)jsonHandler), (MimeTypeEnum)request.getResponseType().getMimeType());
}
@NotNull
private static String generateUrlId(@NotNull ModifierSet attr, @NotNull String imageVersion) {
try {
String netPath = attr.getOrDie(ModifierEnum.I_NET_PATH);
String query = attr.getOrDie(ModifierEnum.I_NET_QUERY);
return URLEncoder.encode(netPath + '?' + query + '&' + "id=" + imageVersion, "UTF-8");
}
catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
}
}