/*
* eID Applet Project.
* Copyright (C) 2008-2009 FedICT.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version
* 3.0 as published by the Free Software Foundation.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, see
* http://www.gnu.org/licenses/.
*/
package test.unit.be.fedict.eid.applet.shared;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import be.fedict.eid.applet.shared.AppletProtocolMessageCatalog;
import be.fedict.eid.applet.shared.annotation.HttpBody;
import be.fedict.eid.applet.shared.annotation.HttpHeader;
import be.fedict.eid.applet.shared.annotation.NotNull;
import be.fedict.eid.applet.shared.annotation.ProtocolStateAllowed;
import be.fedict.eid.applet.shared.annotation.ResponsesAllowed;
import be.fedict.eid.applet.shared.annotation.StartRequestMessage;
import be.fedict.eid.applet.shared.annotation.StateTransition;
import be.fedict.eid.applet.shared.annotation.StopResponseMessage;
public class AppletProtocolMessageCatalogTest {
private static final Log LOG = LogFactory.getLog(AppletProtocolMessageCatalogTest.class);
@Test
public void generateDocbook() throws Exception {
File tmpFile = File.createTempFile("docbook-", ".xml");
generateDocbook(tmpFile);
}
private void generateDocbook(File tmpFile) throws FileNotFoundException, IllegalAccessException {
PrintWriter writer = new PrintWriter(tmpFile);
writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
writer.println("<!DOCTYPE section PUBLIC ");
writer.println("\"-//OASIS//DTD DocBook XML V4.5//EN\"");
writer.println("\"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd\">");
writer.println("<section>");
writer.println("<title>eID Applet Protocol Messages</title>");
writer.println("<para>The following documentation has been generated automatically.</para>");
writer.println("<!-- Autogenerated by " + AppletProtocolMessageCatalogTest.class.getSimpleName() + " -->");
AppletProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
List<Class<?>> catalogClasses = catalog.getCatalogClasses();
for (Class<?> catalogClass : catalogClasses) {
ResponsesAllowed responsesAllowedAnnotation = catalogClass.getAnnotation(ResponsesAllowed.class);
if (null == responsesAllowedAnnotation) {
/*
* We describe request messages first.
*/
continue;
}
describeClass(catalogClass, writer);
}
for (Class<?> catalogClass : catalogClasses) {
ResponsesAllowed responsesAllowedAnnotation = catalogClass.getAnnotation(ResponsesAllowed.class);
if (null != responsesAllowedAnnotation) {
/*
* We describe request messages first.
*/
continue;
}
describeClass(catalogClass, writer);
}
writer.println("</section>");
writer.close();
LOG.debug("docbook file: " + tmpFile.getAbsolutePath());
}
private void describeClass(Class<?> catalogClass, PrintWriter writer)
throws IllegalArgumentException, IllegalAccessException {
writer.println("<section id=\"" + catalogClass.getSimpleName() + "\">");
writer.println("<title>" + catalogClass.getSimpleName() + "</title>");
StartRequestMessage startRequestMessage = catalogClass.getAnnotation(StartRequestMessage.class);
if (null != startRequestMessage) {
writer.println("<para>");
writer.println("This message starts a communication session between eID Applet and eID Applet Service.");
writer.println("It sets the protocol state to: " + startRequestMessage.value());
writer.println("</para>");
}
StopResponseMessage stopResponseMessage = catalogClass.getAnnotation(StopResponseMessage.class);
if (null != stopResponseMessage) {
writer.println("<para>");
writer.println("This message stops a communication session between eID Applet and the eID Applet Service.");
writer.println("</para>");
}
ProtocolStateAllowed protocolStateAllowed = catalogClass.getAnnotation(ProtocolStateAllowed.class);
if (null != protocolStateAllowed) {
writer.println("<para>");
writer.println("This message is only accepted if the eID Applet Service protocol state is: "
+ protocolStateAllowed.value());
writer.println("</para>");
}
Field bodyField = null;
writer.println("<table>");
writer.println("<title>" + catalogClass.getSimpleName() + " HTTP headers</title>");
writer.println("<tgroup cols=\"3\">");
{
writer.println("<colspec colwidth=\"2*\" />");
writer.println("<colspec colwidth=\"1*\" />");
writer.println("<colspec colwidth=\"2*\" />");
writer.println("<thead>");
writer.println("<row>");
writer.println("<entry>Header name</entry>");
writer.println("<entry>Required</entry>");
writer.println("<entry>Value</entry>");
writer.println("</row>");
writer.println("</thead>");
writer.println("<tbody>");
{
Field[] fields = catalogClass.getFields();
for (Field field : fields) {
if (field.getAnnotation(HttpBody.class) != null) {
bodyField = field;
}
HttpHeader httpHeaderAnnotation = field.getAnnotation(HttpHeader.class);
if (null == httpHeaderAnnotation) {
continue;
}
writer.println("<row>");
writer.println("<entry>");
writer.println("<code>" + httpHeaderAnnotation.value() + "</code>");
writer.println("</entry>");
writer.println("<entry>");
writer.println((null != field.getAnnotation(NotNull.class))
|| (0 != (field.getModifiers() & Modifier.FINAL)));
writer.println("</entry>");
writer.println("<entry>");
if (0 != (field.getModifiers() & Modifier.FINAL)) {
Object value = field.get(null);
writer.println("<code>" + value.toString() + "</code>");
} else {
writer.println("Some " + field.getType().getSimpleName() + " value.");
}
writer.println("</entry>");
writer.println("</row>");
}
}
writer.println("</tbody>");
}
writer.println("</tgroup>");
writer.println("</table>");
if (null != bodyField) {
writer.println("<para>HTTP body should contain the data.</para>");
}
ResponsesAllowed responsesAllowedAnnotation = catalogClass.getAnnotation(ResponsesAllowed.class);
if (null != responsesAllowedAnnotation) {
Class<?>[] responsesAllowed = responsesAllowedAnnotation.value();
writer.println("<para>");
writer.println("Allowed eID Applet Service response messages are: ");
for (Class<?> responseAllowed : responsesAllowed) {
writer.println("<xref linkend=\"" + responseAllowed.getSimpleName() + "\"/>");
}
writer.println("</para>");
}
StateTransition stateTransition = catalogClass.getAnnotation(StateTransition.class);
if (null != stateTransition) {
writer.println("<para>");
writer.println(
"This message will perform an eID Applet protocol state transition to: " + stateTransition.value());
writer.println("</para>");
}
writer.println("</section>");
}
}