HotSpotHandler.java
7.14 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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.scene7.is.catalog.util.localization.LocaleMap
* com.scene7.is.provider.DebugInfoEnum
* com.scene7.is.provider.FmtSpec
* com.scene7.is.provider.ProcessingStatus
* com.scene7.is.provider.RequestTypeEnum
* com.scene7.is.provider.RequestTypeSpec
* com.scene7.is.provider.Response
* com.scene7.is.provider.ResponseData
* com.scene7.is.provider.TextResponseTypeEnum
* com.scene7.is.sleng.CacheEnum
* com.scene7.is.sleng.Engine
* com.scene7.is.sleng.FXGServer
* com.scene7.is.sleng.HotSpot
* com.scene7.is.sleng.ImageAccessException
* com.scene7.is.sleng.ImageServer
* com.scene7.is.sleng.LayerFactory
* com.scene7.is.sleng.LayerFactoryTypeEnum
* com.scene7.is.sleng.ResponseFormatEnum
* com.scene7.is.sleng.Sleng
* com.scene7.is.sleng.SlengCodeInterpreter
* com.scene7.is.sleng.SlengNeedImageServerAccess
* com.scene7.is.sleng.SlengPrinter
* com.scene7.is.util.MimeTypeEnum
* com.scene7.is.util.TextEncodingTypeEnum
* com.scene7.is.util.text.ParameterException
* org.jetbrains.annotations.NotNull
*/
package com.scene7.is.ps.provider;
import com.scene7.is.catalog.util.localization.LocaleMap;
import com.scene7.is.provider.DebugInfoEnum;
import com.scene7.is.provider.FmtSpec;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.RequestTypeSpec;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.TextResponseTypeEnum;
import com.scene7.is.ps.provider.HotSpotResponseGenerator;
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.SlengCompiler;
import com.scene7.is.ps.provider.Util;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.Engine;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.HotSpot;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.LayerFactory;
import com.scene7.is.sleng.LayerFactoryTypeEnum;
import com.scene7.is.sleng.ResponseFormatEnum;
import com.scene7.is.sleng.Sleng;
import com.scene7.is.sleng.SlengCodeInterpreter;
import com.scene7.is.sleng.SlengNeedImageServerAccess;
import com.scene7.is.sleng.SlengPrinter;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.text.ParameterException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.jetbrains.annotations.NotNull;
public class HotSpotHandler
implements RequestHandler {
private final ImageServer imageServer;
private final FXGServer fxgServer;
public HotSpotHandler(@NotNull ImageServer imageServer, @NotNull FXGServer fxgServer) {
this.imageServer = imageServer;
this.fxgServer = fxgServer;
}
@NotNull
@Override
public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws ParameterException, IZoomException, ImageAccessException {
String responseString;
ModifierSet attr = parsedRequest.getGlobalAttributes();
DebugInfoEnum debugInfo = parsedRequest.getDebugInfo();
if (debugInfo == DebugInfoEnum.SLENG) {
SlengCompiler compiler = new SlengCompiler(this.imageServer, true, true, true);
byte[] code = compiler.compileRequest(parsedRequest);
return new Response().setData(ResponseData.createResponseMessage((String)SlengPrinter.decompileCode((byte[])code), (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setClientCacheUse(CacheEnum.ON).setRequestType(parsedRequest.getType());
}
SlengCompiler compiler = new SlengCompiler(this.imageServer, true, debugInfo != DebugInfoEnum.NONE, true);
byte[] code = compiler.compileRequest(parsedRequest);
TextResponseTypeEnum format = HotSpotHandler.deriveResponseType(attr);
TextEncodingTypeEnum encoding = parsedRequest.getResponseEncoding();
List<HotSpot> hotSpots = this.getHotSpots(code);
LocaleMap localeMap = parsedRequest.getCatalogValue(ModifierEnum.I_LOCALE_STR_MAP);
String locale = parsedRequest.getGlobalAttributes().getOrDie(ModifierEnum.LOCALE);
switch (format) {
case XML: {
responseString = HotSpotResponseGenerator.toXml(localeMap, locale, hotSpots, encoding);
break;
}
case HTML:
case TEXT: {
responseString = HotSpotResponseGenerator.toHtml(localeMap, locale, hotSpots);
break;
}
case JSON: {
String id = attr.get(ModifierEnum.ID, "");
String handler = attr.get(ModifierEnum.HANDLER, "");
responseString = HotSpotResponseGenerator.toJson(localeMap, locale, hotSpots, id, handler);
break;
}
default: {
throw new IZoomException(IZoomException.UNSUPPORTED_FORMAT, String.valueOf((Object)format), null);
}
}
return new Response().setData(ResponseData.createResponseMessage((String)responseString, (TextEncodingTypeEnum)parsedRequest.getResponseEncoding(), (MimeTypeEnum)format.getMimeType())).setExpiration(Util.computeExpiration(parsedRequest, this.imageServer)).setRequestType(parsedRequest.getType());
}
private static TextResponseTypeEnum deriveResponseType(@NotNull ModifierSet attr) throws ParameterException {
RequestTypeSpec requestTypeSpec = attr.get(ModifierEnum.REQ);
if (requestTypeSpec.format != null) {
return requestTypeSpec.format;
}
if (attr.contains(ModifierEnum.FMT)) {
FmtSpec fmt = attr.getOrDie(ModifierEnum.FMT);
switch (fmt.format) {
case PROPS: {
return TextResponseTypeEnum.PROPS;
}
case XML: {
return TextResponseTypeEnum.XML;
}
case JAVA_SCRIPT: {
return TextResponseTypeEnum.JAVASCRIPT;
}
case HTML: {
return TextResponseTypeEnum.HTML;
}
}
}
return TextResponseTypeEnum.TEXT;
}
private List<HotSpot> getHotSpots(byte[] slengCode) throws ImageAccessException {
boolean needIsAccess = SlengNeedImageServerAccess.needImageServerAccess((byte[])slengCode);
Engine engine = new Engine(this.imageServer.getLayerFactory(LayerFactoryTypeEnum.HOTSPOTS, needIsAccess), this.fxgServer, CacheEnum.ON);
SlengCodeInterpreter interpreter = new SlengCodeInterpreter((Sleng)engine);
try {
interpreter.run((InputStream)new ByteArrayInputStream(slengCode));
List list = engine.getHotSpots();
return list;
}
catch (IOException e) {
throw new AssertionError(e);
}
finally {
engine.dispose();
}
}
}