package pl.net.bluesoft.rnd.processtool.plugins; import com.thoughtworks.xstream.XStream; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig.Feature; import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty; import pl.net.bluesoft.util.lang.Classes; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Field; import java.util.*; import java.util.logging.Logger; public class StepExposureServlet extends HttpServlet { public enum Format { JSON, XML } private static final String NAME = "name"; private static final String TYPE = "type"; private static final String PARAMETERS = "parameters"; private static final String REQUIRED = "required"; private static Logger logger = Logger.getLogger(StepExposureServlet.class.getName()); private static final ObjectMapper mapper = new ObjectMapper(); private static final XStream xstream = new XStream(); private static final Format DEFAULT_FORMAT = Format.JSON; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ProcessToolRegistry reg = (ProcessToolRegistry) getServletContext().getAttribute(ProcessToolRegistry.class.getName()); resp.setContentType("text/plain"); List<Map<String, Object>> steps = new LinkedList<Map<String, Object>>(); Map<String,ProcessToolProcessStep> availableSteps = reg.getAvailableSteps(); Set<Class> classes = new HashSet<Class>(); for (ProcessToolProcessStep stepInstance : availableSteps.values()) { Class stepClass = stepInstance.getClass(); classes.add(stepClass); } for (Class stepClass : classes) { Map<String, Object> map = new HashMap<String, Object>(); AliasName a = Classes.getClassAnnotation(stepClass, AliasName.class); map.put(NAME, a.name()); List<Field> fields = Classes.getFieldsWithAnnotation(stepClass, AutoWiredProperty.class); List<Map<String, Object>> parameters = new ArrayList<Map<String, Object>>(); if (fields != null) { for (Field field : fields) { Map<String, Object> parameter = new HashMap<String, Object>(); parameter.put(NAME, field.getName()); parameter.put(TYPE, field.getType()); AutoWiredProperty awp = field.getAnnotation(AutoWiredProperty.class); parameter.put(REQUIRED, awp != null && awp.required()); parameters.add(parameter); } } map.put(PARAMETERS, parameters); steps.add(map); } PrintWriter out = resp.getWriter(); String formatString = req.getParameter("format"); Format format; if (formatString == null) { format = DEFAULT_FORMAT; } else { format = Format.valueOf(formatString.toUpperCase()); } switch (format) { case XML: { out.write(xstream.toXML(steps)); break; } case JSON: { mapper.configure(Feature.INDENT_OUTPUT, true); mapper.writeValue(out, steps); break; } } out.close(); logger.info(this.getClass().getSimpleName() + " GET"); } @Override public void init() throws ServletException { super.init(); logger.info(this.getClass().getSimpleName() + " INITIALIZED: " + getServletContext().getContextPath()); } @Override public void destroy() { super.destroy(); logger.info(this.getClass().getSimpleName() + " DESTROYED"); } }