package org.jboss.seam.remoting;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.remoting.BeanMetadata.BeanType;
/**
* Generates JavaScript interface code.
*
* @author Shane Bryzak
*/
public class InterfaceGenerator implements RequestHandler {
@Inject
MetadataCache metadataCache;
/**
* Handles the request
*/
public void handle(final HttpServletRequest request,
final HttpServletResponse response) throws Exception {
if (request.getQueryString() == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
"Invalid request - no component specified");
}
response.setContentType("text/javascript");
Set<String> names = new HashSet<String>();
Enumeration<?> e = request.getParameterNames();
while (e.hasMoreElements()) {
names.add(((String) e.nextElement()).trim());
}
appendBeanSource(response.getOutputStream(), metadataCache.loadBeans(names));
}
/**
* Appends the interface code for a set of bean classes to an OutputStream.
*
* @param out OutputStream
* @param classType Class<?>
* @param types Set<Type>
* @throws IOException
*/
private void appendBeanSource(OutputStream out, Set<BeanMetadata> types)
throws IOException {
StringBuilder src = new StringBuilder();
for (BeanMetadata meta : types) {
if (meta.getBeanType() == BeanType.action) {
src.append("Seam.registerBean(\"");
src.append(meta.getName());
src.append("\", null, {");
boolean first = true;
for (String methodName : meta.getMethods().keySet()) {
if (!first) {
src.append(", ");
} else {
first = false;
}
src.append(methodName);
src.append(": ");
src.append(meta.getMethods().get(methodName));
}
src.append("});\n");
} else {
src.append("Seam.registerBean(\"");
src.append(meta.getName());
src.append("\", {");
boolean first = true;
for (String propertyName : meta.getProperties().keySet()) {
if (!first) {
src.append(", ");
} else {
first = false;
}
src.append(propertyName);
src.append(": \"");
src.append(meta.getProperties().get(propertyName));
src.append("\"");
}
src.append("});\n");
}
}
out.write(src.toString().getBytes());
}
}