Salvatore La Manna
3 anni fa
9 ha cambiato i file con 298 aggiunte e 9 eliminazioni
@ -0,0 +1,165 @@ |
|||||||
|
package it.mwg.sicilia.sue.api.v1.command.impl; |
||||||
|
|
||||||
|
import it.mwg.sicilia.sue.api.v1.Parameters; |
||||||
|
import it.mwg.sicilia.sue.api.v1.command.Command; |
||||||
|
import it.mwg.sicilia.sue.api.v1.command.CommandList; |
||||||
|
import it.mwg.sicilia.sue.api.v1.parameter.Parameter; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.LinkedHashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils; |
||||||
|
|
||||||
|
import com.liferay.portal.kernel.json.JSONFactoryUtil; |
||||||
|
import com.liferay.portal.kernel.json.JSONSerializer; |
||||||
|
import com.liferay.portal.kernel.servlet.HttpMethods; |
||||||
|
import com.liferay.portal.kernel.servlet.ServletResponseUtil; |
||||||
|
import com.liferay.portal.kernel.util.Http; |
||||||
|
import com.liferay.portal.kernel.util.StringPool; |
||||||
|
|
||||||
|
public class ManualHtml extends Command { |
||||||
|
|
||||||
|
@SuppressWarnings("serial") |
||||||
|
private static final List<Parameter> OUTPUT_PARAMETERS = new ArrayList<Parameter>() { |
||||||
|
{ |
||||||
|
add(new Parameter(StringPool.BLANK, Parameter.TYPES.TEXT_HTML, "Il testo del manuale (questa pagina)")); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
private static String baseUrl = null; |
||||||
|
|
||||||
|
private static final JSONSerializer serializer = JSONFactoryUtil.createJSONSerializer(); |
||||||
|
|
||||||
|
public ManualHtml(String verb, String description, String... methods) { |
||||||
|
super(verb, description, methods); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||||
|
|
||||||
|
String cssFile = "/css/api/v1/api.css"; |
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
result.append("<!doctype html>").append("<meta charset=\"utf-8\">") |
||||||
|
.append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">") |
||||||
|
.append("<head><title>Manual</title>").append("<link rel=\"stylesheet\" href=\"") |
||||||
|
.append(request.getContextPath()).append(cssFile).append("?v=") |
||||||
|
.append(new File(request.getServletContext().getRealPath(cssFile)).lastModified()).append("\">") |
||||||
|
.append("</head><body>"); |
||||||
|
for (Command command : CommandList.getList()) { |
||||||
|
result.append("<div class=\"command\">Comando: <b>/").append(command.getVerb()).append("</b>"); |
||||||
|
if (command.isSecure()) { |
||||||
|
result.append(" [T]"); |
||||||
|
} |
||||||
|
result.append("<div class=\"description\">").append(command.getDescription()).append("</div>"); |
||||||
|
result.append("<div class=\"methods\">Metodi: ") |
||||||
|
.append(StringUtils.join(command.getMethods(), StringPool.COMMA_AND_SPACE)).append("</div>"); |
||||||
|
result.append("<div class=\"parameters\">Parametri:"); |
||||||
|
List<Parameter> parameters = command.getInputParameters(); |
||||||
|
if (parameters.isEmpty()) { |
||||||
|
result.append(" Nessuno</div>"); |
||||||
|
} else { |
||||||
|
for (Parameter parameter : parameters) { |
||||||
|
result.append("<div class=\"parameter\">").append(parameter.getName()); |
||||||
|
if (parameter.isRequired()) { |
||||||
|
result.append(StringPool.STAR); |
||||||
|
} |
||||||
|
result.append(" (").append(parameter.getType().toString()).append(") - ") |
||||||
|
.append(parameter.getDescription()).append("</div>"); |
||||||
|
} |
||||||
|
result.append("</div>"); |
||||||
|
} |
||||||
|
parameters = command.getOutputParameters(); |
||||||
|
if (!parameters.isEmpty()) { |
||||||
|
result.append("<div class=\"returns\">Restituisce:"); |
||||||
|
for (Parameter parameter : parameters) { |
||||||
|
result.append("<div class=\"parameter\">").append(parameter.getName()).append(" (") |
||||||
|
.append(parameter.getType().toString()).append(") - ").append(parameter.getDescription()); |
||||||
|
if (parameter.getType().equals(Parameter.TYPES.ARRAY)) { |
||||||
|
for (Parameter subParameter : parameter.getSubParameters()) { |
||||||
|
result.append("<div class=\"parameter\">").append(subParameter.getName()).append(" (") |
||||||
|
.append(subParameter.getType().toString()).append(") - ") |
||||||
|
.append(subParameter.getDescription()).append("</div>"); |
||||||
|
} |
||||||
|
} |
||||||
|
result.append("</div>"); |
||||||
|
} |
||||||
|
} |
||||||
|
result.append("</div>"); |
||||||
|
result.append("<div class=\"example\">Esempio:<pre>").append(getCurlExample(command, getBaseUrl(request))) |
||||||
|
.append("</pre></div>"); |
||||||
|
result.append("</div>"); // class="command"
|
||||||
|
} |
||||||
|
result.append("<div class=\"notes\">Note:<br>[T] = Richiede token di autenticazione: header di richiesta \"") |
||||||
|
.append(Parameters.X_AUTH_TOKEN).append("\" oppure parametro \"").append(Parameters.TOKEN) |
||||||
|
.append("\"<br>* = Parametro obbligatorio</div>"); |
||||||
|
result.append("</body></html>"); |
||||||
|
setTextHtml(response); |
||||||
|
ServletResponseUtil.write(response, result.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
private String getCurlExample(Command command, String baseUrl) { |
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append("curl "); |
||||||
|
if (command.isSecure()) { |
||||||
|
sb.append("--header \"").append(Parameters.X_AUTH_TOKEN).append(": $TOKEN\"").append(" \\\n\t"); |
||||||
|
} |
||||||
|
if (command.getMethods().contains(HttpMethods.GET)) { |
||||||
|
} else { |
||||||
|
sb.append("--header \"Content-Type: application/json; charset=UTF-8\" \\\n\t"); |
||||||
|
sb.append("--request POST \\\n\t"); |
||||||
|
Map<String, Serializable> data = new LinkedHashMap<>(); |
||||||
|
for (Parameter parameter : command.getInputParameters()) { |
||||||
|
if (parameter.isRequired()) { |
||||||
|
if (parameter.getType().equals(Parameter.TYPES.STRING)) { |
||||||
|
data.put(parameter.getName(), parameter.getName()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (data.size() > 0) { |
||||||
|
sb.append("--data '").append(serializer.serialize(data)).append("' \\\n\t"); |
||||||
|
} |
||||||
|
} |
||||||
|
sb.append(StringPool.APOSTROPHE).append(baseUrl).append(command.getVerb()).append(StringPool.APOSTROPHE) |
||||||
|
.append(StringPool.NEW_LINE); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private String getBaseUrl(HttpServletRequest request) { |
||||||
|
|
||||||
|
if (null == baseUrl) { |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
sb.append(request.isSecure() ? Http.HTTPS_WITH_SLASH : Http.HTTP_WITH_SLASH); |
||||||
|
sb.append(request.getServerName()); |
||||||
|
if ((request.isSecure() && (request.getServerPort() != Http.HTTPS_PORT)) |
||||||
|
|| (!request.isSecure() && (request.getServerPort() != Http.HTTP_PORT))) { |
||||||
|
sb.append(StringPool.COLON).append(request.getServerPort()); |
||||||
|
} |
||||||
|
sb.append(request.getContextPath()).append(request.getServletPath()).append(StringPool.FORWARD_SLASH); |
||||||
|
baseUrl = sb.toString(); |
||||||
|
} |
||||||
|
return baseUrl; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isSecure() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Parameter> getInputParameters() { |
||||||
|
return EMPTY_PARAMETERS; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Parameter> getOutputParameters() { |
||||||
|
return OUTPUT_PARAMETERS; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/* http://meyerweb.com/eric/tools/css/reset/ |
||||||
|
v2.0 | 20110126 |
||||||
|
License: none (public domain) */ |
||||||
|
html, body, div, span, applet, object, iframe, |
||||||
|
h1, h2, h3, h4, h5, h6, p, blockquote, pre, |
||||||
|
a, abbr, acronym, address, big, cite, code, |
||||||
|
del, dfn, em, img, ins, kbd, q, s, samp, |
||||||
|
small, strike, strong, sub, sup, tt, var, |
||||||
|
b, u, i, center, |
||||||
|
dl, dt, dd, ol, ul, li, |
||||||
|
fieldset, form, label, legend, |
||||||
|
table, caption, tbody, tfoot, thead, tr, th, td, |
||||||
|
article, aside, canvas, details, embed, |
||||||
|
figure, figcaption, footer, header, hgroup, |
||||||
|
menu, nav, output, ruby, section, summary, |
||||||
|
time, mark, audio, video { |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
border: 0; |
||||||
|
font-size: 100%; |
||||||
|
font: inherit; |
||||||
|
vertical-align: baseline; |
||||||
|
} |
||||||
|
/* HTML5 display-role reset for older browsers */ |
||||||
|
article, aside, details, figcaption, figure, |
||||||
|
footer, header, hgroup, menu, nav, section { |
||||||
|
display: block; |
||||||
|
} |
||||||
|
body { |
||||||
|
line-height: 1; |
||||||
|
} |
||||||
|
ol, ul { |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
blockquote, q { |
||||||
|
quotes: none; |
||||||
|
} |
||||||
|
blockquote:before, blockquote:after, |
||||||
|
q:before, q:after { |
||||||
|
content: ''; |
||||||
|
content: none; |
||||||
|
} |
||||||
|
table { |
||||||
|
border-collapse: collapse; |
||||||
|
border-spacing: 0; |
||||||
|
} |
||||||
|
/* End reset.css */ |
||||||
|
body { |
||||||
|
margin: 10px; |
||||||
|
font-family: sans-serif; |
||||||
|
} |
||||||
|
div { |
||||||
|
margin-bottom: 5px; |
||||||
|
} |
||||||
|
b { |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
pre { |
||||||
|
background-color: #ccc; |
||||||
|
width: fit-content; |
||||||
|
padding: 10px; |
||||||
|
border: 1px solid #999; |
||||||
|
} |
||||||
|
.command { |
||||||
|
border-bottom: 1px solid #999; |
||||||
|
padding: 10px 0; |
||||||
|
} |
||||||
|
.parameter { |
||||||
|
margin-left: 40px; |
||||||
|
} |
Caricamento…
Reference in new issue