blob: 1ccc53e2385c8d2be746818a1bdd8bb0c73f763a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.org.apache.felix.ipojo.webconsole;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.HandlerFactory;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.ipojo.architecture.Architecture;
import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.HandlerDescription;
import org.apache.felix.ipojo.architecture.InstanceDescription;
import org.apache.felix.ipojo.architecture.PropertyDescription;
import org.apache.felix.ipojo.handlers.dependency.DependencyDescription;
import org.apache.felix.ipojo.handlers.dependency.DependencyHandlerDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedService;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandlerDescription;
import org.apache.felix.ipojo.util.DependencyModel;
import org.apache.felix.webconsole.AbstractWebConsolePlugin;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
/**
* iPOJO Plugin for the web console.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
@Component(immediate = true)
@Provides(specifications = { Servlet.class })
public class IPOJOServlet extends AbstractWebConsolePlugin {
/**
* Factory constant.
*/
public static final String FACTORY = "factory";
/**
* Instance constant.
*/
public static final String INSTANCE = "instance";
/**
* Handler constant.
*/
public static final String HANDLER = "handler";
/**
* All constant.
*/
public static final String ALL = "all";
/**
* UUID.
*/
private static final long serialVersionUID = 1L;
/**
* Label used by the web console.
*/
@ServiceProperty(name = "felix.webconsole.label")
private String m_label = "ipojo";
/**
* Title used by the web console.
*/
@ServiceProperty(name = "felix.webconsole.title")
private String m_title = "iPOJO";
/**
* List of available Architecture service.
*/
@Requires(optional = true, specification = "org.apache.felix.ipojo.architecture.Architecture")
private List<Architecture> m_archs;
/**
* List of available Factories.
*/
@Requires(optional = true, specification = "org.apache.felix.ipojo.Factory")
private List<Factory> m_factories;
/**
* List of available Handler Factories.
*/
@Requires(optional = true, specification = "org.apache.felix.ipojo.HandlerFactory")
private List<HandlerFactory> m_handlers;
/**
* Creates a IPOJOServlet.
* This method activates the plugin.
* @param bc the bundle context
*/
public IPOJOServlet(BundleContext bc) {
activate(bc);
}
/**
* Stop method.
* This method deactivates the plugin.
*/
@Invalidate
public void stop() {
deactivate();
}
/**
* Gets the plugin label.
* @return the label
* @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel()
*/
public String getLabel() {
return m_label;
}
/**
* Gets the plugin title.
* @return the title
* @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle()
*/
public String getTitle() {
return m_title;
}
/**
* Gets the number of valid instances.
* @return the number of valid instances.
*/
private int getValidCount() {
int i = 0;
for (Architecture a : m_archs) {
if (a.getInstanceDescription().getState() == ComponentInstance.VALID) {
i ++;
}
}
return i;
}
/**
* Gets the number of invalid instances.
* @return the number of invalid instances.
*/
private int getInvalidCount() {
int i = 0;
for (Architecture a : m_archs) {
if (a.getInstanceDescription().getState() == ComponentInstance.INVALID) {
i ++;
}
}
return i;
}
/**
* Gets the HTML content of the plugin.
* @param req the request
* @param res the response
* @throws ServletException if the content cannot be computed
* @throws IOException if an IO Exception occurs
* @see org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void renderContent(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
PrintWriter writer = res.getWriter();
// Set the fable plugin_table sortable.
writer.write("<script type=\"text/javascript\"> "
+ "function setSortable() { \n"
+ "$(document).ready(function() { \n"
+ "$(\"#plugin_table\").tablesorter(); \n"
+ "})};\n"
+ "setSortable();"
+ "</script>");
// Status Line
writer.write("<div class=\"fullwidth\"><div class=\"statusline\">"
+ m_archs.size() + " instances in total, "
+ getValidCount() + " valid instances, "
+ getInvalidCount() + " invalid instances."
+ "</div></div>");
// Button Line
writer.write("<form action=\"ipojo\" method=\"get\">"
+ "<div class=\"fullwidth\">"
+ "<div class=\"buttons\">"
+ "<button style=\"margin-left: 30px;\" name=\"" + INSTANCE + "\" value=\"all\" type=\"submit\">Instances</button>"
+ "<button style=\"margin-left: 30px;\" name=\"" + FACTORY + "\" value=\"all\" type=\"submit\">Factories</button>"
+ "<button style=\"margin-left: 30px;\" name=\"" + HANDLER + "\" value=\"all\" type=\"submit\">Handlers</button>"
+ "</div>"
+ "</div>"
+ "</form>");
// Compute the request and select the content to return
RequestInfo ri = new RequestInfo(req);
if (ri.m_type.equals(FACTORY)) {
if (ri.m_all) {
printFactoryList(writer);
} else {
printFactoryDetail(writer, ri.m_name);
}
}
if (ri.m_type.equals(INSTANCE)) {
if (ri.m_all) {
printInstanceList(writer);
} else {
printInstanceDetail(writer, ri.m_name);
}
}
if (ri.m_type.equals(HANDLER)) {
if (ri.m_all) {
printHandlerList(writer);
}
}
// Button Line
writer.write("<form action=\"ipojo\" method=\"get\">"
+ "<div class=\"fullwidth\">"
+ "<div class=\"buttons\">"
+ "<button style=\"margin-left: 30px;\" name=\"" + INSTANCE + "\" value=\"all\" type=\"submit\">Instances</button>"
+ "<button style=\"margin-left: 30px;\" name=\"" + FACTORY + "\" value=\"all\" type=\"submit\">Factories</button>"
+ "<button style=\"margin-left: 30px;\" name=\"" + HANDLER + "\" value=\"all\" type=\"submit\">Handlers</button>"
+ "</div>"
+ "</div>"
+ "</form>");
// Status Line
writer.write("<div class=\"fullwidth\"><div class=\"statusline\">"
+ m_archs.size() + " instances in total, "
+ getValidCount() + " valid instances, "
+ getInvalidCount() + " invalid instances."
+ "</div></div>");
}
/**
* Gets a Factory Detail page.
* This page contains all versions of the factories.
* @param pw the writer
* @param name the name of the factory
*/
private void printFactoryDetail(PrintWriter pw, String name) {
List<ComponentTypeDescription> fs = new ArrayList<ComponentTypeDescription>();
for (Factory f : this.m_factories) {
if (f.getName().equals(name)) {
fs.add(f.getComponentDescription());
}
}
pw.write("<div class=\"table\">");
if (fs.isEmpty()) {
pw.write("<b>Factory not found</b><br>The factory " + name + " does not exist or is private");
} else {
for (ComponentTypeDescription factory : fs) {
pw.write("<table class=\"tablelayout\" border=\"0\"><tbody>");
addEntry(pw, "Factory Name", factory.getName());
if (factory.getVersion() != null) {
addEntry(pw, "Factory Version", factory.getVersion());
}
addEntry(pw, "State", getFactoryState(factory.getFactory().getState()));
addEntry(pw, " ", " ");
if (factory.getprovidedServiceSpecification() != null && factory.getprovidedServiceSpecification().length != 0) {
addEntry(pw, "Provided Service Specification", Arrays.toString(factory.getprovidedServiceSpecification()));
}
if (factory.getProperties() != null && factory.getProperties().length != 0) {
addEntry(pw, "Properties", getProperties(factory.getProperties()));
}
addEntry(pw, " ", " ");
addEntry(pw, "Required Handlers", factory.getFactory().getRequiredHandlers().toString());
addEntry(pw, "Missing Handlers", factory.getFactory().getMissingHandlers().toString());
addEntry(pw, " ", " ");
addEntry(pw, "Created Instances", getInstanceList(factory.getName()));
addEntry(pw, " ", " ");
addEntry(pw, "Architecture",
"<div style=\"overflow: auto; width:800px; border: 1px solid #666; background-color: #ccc; padding: 8px;\"><pre>"
+ factory.getDescription().toString()
+ "</pre></div>");
pw.write("</tbody></table>");
}
}
pw.write("</div>");
}
/**
* Gets component type properties HTML table.
* @param properties the properties to display
* @return the HTML code of the table
*/
private String getProperties(PropertyDescription[] properties) {
String s = "<table class=\"tablelayout\" style=\"border-top: 1px solid #6181A9;\">"
+ "<thead style=\"border-top: 1px solid #6181A9;\">"
+ "<tr>"
+ "<th>Property Name</th>"
+ "<th>Property Type</th>"
+ "<th>Mandatory</th>"
+ "<th>Immutable</th>"
+ "<th>Value</th>"
+ "</tr>"
+ "</thead>"
+ "<tbody>";
for (PropertyDescription pd : properties) {
String name = pd.getName();
String type = pd.getType();
boolean mandatory = pd.isMandatory();
boolean immutable = pd.isImmutable();
String value = pd.getValue();
s += "<tr>"
+ "<td>" + name + "</td>"
+ "<td>" + type + "</td>"
+ "<td>" + "" + mandatory + "</td>"
+ "<td>" + "" + immutable + "</td>"
+ "<td>" + (value == null ? "<i>No Value</i>" : value) + "</td>"
+ "</tr>";
}
s += "</tbody></table>";
return s;
}
/**
* Gets the instance list page.
* @param pw the writer
*/
private void printInstanceList(PrintWriter pw) {
pw.write("<div class=\"table\">"
+ "<table id=\"plugin_table\" class=\"tablelayout\">"
+ "<thead>"
+ "<tr>"
+ "<th class=\"col_Name header headerSortDown\">Instance Name</th>"
+ "<th class=\"col_Factory header \">Factory Name</th>"
+ "<th class=\"col_State header \">State</th>"
+ "</tr>"
+ "</thead>"
+ "<tbody>");
for (Architecture arch : m_archs) {
InstanceDescription id = arch.getInstanceDescription();
String name = id.getName();
String factory = id.getComponentDescription().getName();
String state = getInstanceState(id.getState());
pw.write("<tr>"
+ "<td>" + getInstanceLink(name) + "</td>"
+ "<td>" + factory + "</td>"
+ "<td>" + state + "</td>"
+ "</tr>");
}
pw.write("</tbody></table>");
}
/**
* Adds a line into a key / value table.
* @param pw the writer
* @param header the key
* @param value the value (may be HTML code)
*/
private void addEntry(PrintWriter pw, String header, String value) {
pw.write(addEntry(header, value));
}
/**
* Gets the HTML code of a key / value table row.
* @param header the key
* @param value the value (may be HTML code)
* @return the HTML code of the line
*/
private String addEntry(String header, String value) {
return "<tr>"
+ "<td class=\"aligntop\" nowrap=\"true\" style=\"border: 0px none;\">" + header + "</td>"
+ "<td class=\"aligntop\" style=\"border: 0px none ;\">" + value + "</td>"
+ "</tr>";
}
/**
* Gets the factory link if the factory exists.
* @param id the factory name
* @return the HTML link targetting the detail of the factory or just the factory name.
*/
private String getFactoryLinkIfPossible(InstanceDescription id) {
String n = id.getComponentDescription().getName();
System.out.println("Look for " + n);
for (Factory f : m_factories) {
if (f.getName().equals(n)) {
return "<a href=\"ipojo?factory=" + n + "\">" + n + "</a>";
}
}
return n; // No link
}
/**
* Gets the list of invalid handler.
* @param hl the handler description list.
* @return the list of invalid handlers.
*/
private String getInvalidHandlerList(HandlerDescription[] hl) {
List<String> list = new ArrayList<String>();
for (HandlerDescription hd : hl) {
if (! hd.isValid()) {
list.add(hd.getHandlerName());
}
}
return list.toString();
}
/**
* Gets the page containing instance detail.
* @param pw the writer
* @param name the instance name
*/
private void printInstanceDetail(PrintWriter pw, String name) {
InstanceDescription desc = getInstanceDescriptionByName(name);
pw.write("<div class=\"table\">");
if (desc == null) {
pw.write("<b>Instance not found</b><br>The instance " + name + " does not exist or does not expose its architecture");
} else {
pw.write("<table class=\"tablelayout\" border=\"0\"><tbody>");
addEntry(pw, "Instance Name", desc.getName());
addEntry(pw, "Factory", getFactoryLinkIfPossible(desc));
if (desc.getState() == ComponentInstance.INVALID) {
addEntry(pw, "Invalid Handlers", getInvalidHandlerList(desc.getHandlers()));
}
addEntry(pw, " ", " ");
addEntry(pw, "Provided Services", getProvidedServiceDetail(desc.getHandlerDescription("org.apache.felix.ipojo:provides")));
addEntry(pw, "Required Services", getRequiredServiceDetail(desc.getHandlerDescription("org.apache.felix.ipojo:requires")));
addEntry(pw, " ", " ");
addEntry(pw, "Architecture",
"<div style=\"overflow: auto; width:800px; border: 1px solid #666; background-color: #ccc; padding: 8px;\"><pre>"
+ desc.getDescription().toString()
+ "</pre></div>");
pw.write("</tbody></table>");
}
pw.write("</div>");
}
/**
* Gets the HTML link targeting this instance.
* @param name the instance name
* @return the HTML link targetting the instance detail
*/
private String getInstanceLink(String name) {
return "<a href=\"ipojo?instance=" + name + "\">" + name + "</a>";
}
/**
* Gets the HTML list of service properties.
* @param properties the properties
* @return the HTML code containing the service properties.
*/
private String getServiceProperties(Properties properties) {
String s = "<ul>";
Enumeration<Object> e = properties.keys();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = properties.get(key).toString();
s += "<li>" + key + " = " + value + "</li>";
}
s += "</ul>";
return s;
}
/**
* Gets the instance list created by the given factory.
* @param factory the factory name
* @return the HTML list containing the created instances
*/
private String getInstanceList(String factory) {
String s = "<ul>";
for (Architecture arch : m_archs) {
String n = arch.getInstanceDescription().getComponentDescription().getName();
if (factory.equals(n)) {
s += "<li>" + getInstanceLink(arch.getInstanceDescription().getName()) + "</li>";
}
}
s += "</ul>";
return s;
}
/**
* Gets the HTML list containing service references.
* If the service is provided by an iPOJO instance, the link is inserted.
* @param refs the references.
* @return the HTML list
*/
private String getServiceReferenceList(List<ServiceReference> refs) {
String s = "<ul>";
for (ServiceReference ref : refs) {
s += "<li>";
if (ref.getProperty("instance.name") == null) {
s += ref.getProperty(Constants.SERVICE_ID);
} else {
s += "<a href=\"ipojo?instance="
+ ref.getProperty("instance.name") + "\">"
+ ref.getProperty("instance.name") + " (" + ref.getProperty(Constants.SERVICE_ID) + ")</a>";
}
s += "</li>";
}
s += "</ul>";
return s;
}
/**
* Gets provided service details.
* @param hd the provided service handler description or <code>null</code> if not found.
* @return the details about provided services
*/
private String getProvidedServiceDetail(HandlerDescription hd) {
if (hd == null) {
return "No provided services";
}
String r = "";
ProvidedServiceHandlerDescription desc = (ProvidedServiceHandlerDescription) hd;
for (ProvidedServiceDescription ps : desc.getProvidedServices()) {
r += "<table border=\"0\"><tbody>";
r += addEntry("Specification", Arrays.toString(ps.getServiceSpecifications()));
r += addEntry("State", getProvidedServiceState(ps.getState()));
if (ps.getServiceReference() != null) {
r += addEntry("Service Id", ((Long) ps.getServiceReference().getProperty(Constants.SERVICE_ID)).toString());
}
r += addEntry("Service Properties", getServiceProperties(ps.getProperties()));
r += "</tbody></table>";
r += "<hr style=\"color: #CCCCCC;'\"/>";
}
return r;
}
/**
* Gets required service details.
* @param hd the required service handler description or <code>null</code> if not found.
* @return the details about required services
*/
private String getRequiredServiceDetail(
HandlerDescription hd) {
if (hd == null) {
return "No required services";
}
String r = "";
DependencyHandlerDescription desc = (DependencyHandlerDescription) hd;
for (DependencyDescription dep : desc.getDependencies()) {
r += "<table border=\"0\" style=\"margin-bottom:5px\"><tbody>";
r += addEntry("Specification", dep.getSpecification());
r += addEntry("Id", "" + dep.getId());
r += addEntry("State", getDependencyState(dep.getState()));
r += addEntry("Binding Policy" , getDependencyBindingPolicy(dep.getPolicy()));
r += addEntry("Optional", "" + dep.isOptional());
r += addEntry("Aggregate", "" + dep.isMultiple());
if (dep.getFilter() != null) {
r += addEntry("Filter", "" + dep.getFilter());
}
if (dep.getComparator() != null) {
r += addEntry("Comparator", "" + dep.getComparator());
}
r += addEntry("Matching Services", getServiceReferenceList(dep.getServiceReferences()));
r += addEntry("Used Services", getServiceReferenceList(dep.getUsedServices()));
r += "</tbody></table>";
r += "<hr style=\"color: #CCCCCC;'\"/>";
}
return r;
}
/**
* Gets the instance description by name.
* @param name the instance name
* @return the instance description or <code>null</code> if not found
*/
private InstanceDescription getInstanceDescriptionByName(String name) {
for (Architecture arch : m_archs) {
if (name.equals(arch.getInstanceDescription().getName())) {
return arch.getInstanceDescription();
}
}
return null;
}
/**
* Prints the factory list.
* @param pw the writer.
*/
private void printFactoryList(PrintWriter pw) {
pw.write("<div class=\"table\">"
+ "<table id=\"plugin_table\" class=\"tablelayout\">"
+ "<thead>"
+ "<tr>"
+ "<th class=\"col_Name header headerSortDown\">Factory Name</th>"
+ "<th class=\"col_Bundle header \">Bundle</th>"
+ "<th class=\"col_State header \">State</th>"
+ "</tr>"
+ "</thead>"
+ "<tbody>");
for (Factory factory : m_factories) {
String name = factory.getName();
String version = factory.getVersion();
String state = getFactoryState(factory.getState());
String bundle = factory.getBundleContext().getBundle().getSymbolicName()
+ " (" + factory.getBundleContext().getBundle().getBundleId() + ")";
pw.write("<tr>"
+ "<td><a href=\"ipojo?factory=" + name + "\">"
+ (version == null ? name : name + " (" + version + ")")
+ "</a></td>" //TODO Link
+ "<td>" + bundle + "</td>"
+ "<td>" + state + "</td>"
+ "</tr>");
}
pw.write("</tbody></table>");
}
/**
* Print the handler list.
* @param pw the writer.
*/
private void printHandlerList(PrintWriter pw) {
pw.write("<div class=\"table\">"
+ "<table id=\"plugin_table\" class=\"tablelayout\">"
+ "<thead>"
+ "<tr>"
+ "<th class=\"col_Name header headerSortDown\">Handler Name</th>"
+ "<th class=\"col_Type header \">Handler Type</th>"
+ "<th class=\"col_Bundle header \">Bundle</th>"
+ "<th class=\"col_State header \">State</th>"
+ "<th class=\"col_MissingHandler header \">Missing Handler</th>"
+ "</tr>"
+ "</thead>"
+ "<tbody>");
for (HandlerFactory hf : m_handlers) {
String name = hf.getHandlerName();
String type = hf.getType();
String state = getFactoryState(hf.getState());
String bundle = hf.getBundleContext().getBundle().getSymbolicName()
+ " (" + hf.getBundleContext().getBundle().getBundleId() + ")";
String missing = hf.getMissingHandlers().isEmpty() ? "<i>no missing handlers</i>" : hf.getMissingHandlers().toString();
pw.write("<tr>"
+ "<td>" + name + "</td>"
+ "<td>" + type + "</td>"
+ "<td>" + bundle + "</td>"
+ "<td>" + state + "</td>"
+ "<td>" + missing + "</td>"
+ "</tr>");
}
pw.write("</tbody></table>");
}
/**
* Gets the instance state as a String.
* @param state the state.
* @return the String form of the state.
*/
private String getInstanceState(int state) {
switch(state) {
case ComponentInstance.VALID :
return "valid";
case ComponentInstance.INVALID :
return "invalid";
case ComponentInstance.DISPOSED :
return "disposed";
case ComponentInstance.STOPPED :
return "stopped";
default :
return "unknown";
}
}
/**
* Gets the factory state as a String.
* @param state the state.
* @return the String form of the state.
*/
private String getFactoryState(int state) {
switch(state) {
case Factory.VALID :
return "valid";
case Factory.INVALID :
return "invalid";
default :
return "unknown";
}
}
/**
* Gets the dependency state as a String.
* @param state the state.
* @return the String form of the state.
*/
private String getDependencyState(int state) {
switch(state) {
case DependencyModel.RESOLVED :
return "resolved";
case DependencyModel.UNRESOLVED :
return "unresolved";
case DependencyModel.BROKEN :
return "broken";
default :
return "unknown (" + state + ")";
}
}
/**
* Gets the dependency binding policy as a String.
* @param policy the policy.
* @return the String form of the policy.
*/
private String getDependencyBindingPolicy(int policy) {
switch(policy) {
case DependencyModel.DYNAMIC_BINDING_POLICY :
return "dynamic";
case DependencyModel.DYNAMIC_PRIORITY_BINDING_POLICY :
return "dynamic-priority";
case DependencyModel.STATIC_BINDING_POLICY :
return "static";
default :
return "unknown (" + policy + ")";
}
}
/**
* Gets the provided service state as a String.
* @param state the state.
* @return the String form of the state.
*/
private String getProvidedServiceState(int state) {
switch(state) {
case ProvidedService.REGISTERED :
return "registered";
case ProvidedService.UNREGISTERED :
return "unregistered";
default :
return "unknown (" + state + ")";
}
}
private final class RequestInfo {
/**
* Name of the required element.
*/
public final String m_name;
/**
* Type of the required element.
*/
public final String m_type;
/**
* Is 'all' elements of the type required.
*/
public final boolean m_all;
/**
* Creates a RequestInfo.
* This constructor parses the parameter of the request.
* @param request the request
*/
protected RequestInfo(final HttpServletRequest request) {
String factory = request.getParameter(FACTORY);
String instance = request.getParameter(INSTANCE);
String handler = request.getParameter(HANDLER);
if (factory != null) {
m_type = FACTORY;
m_name = factory;
} else if (instance != null) {
m_type = INSTANCE;
m_name = instance;
} else if (handler != null) {
m_type = HANDLER;
m_name = handler;
} else {
m_type = INSTANCE;
m_name = ALL;
}
if (ALL.equals(m_name)) {
m_all = true;
} else {
m_all = false;
}
request.setAttribute(IPOJOServlet.class.getName(), this);
}
/**
* toString method.
* @return the String form of the request.
* @see java.lang.Object#toString()
*/
public String toString() {
return "Request: " + m_type + "=" + m_name;
}
}
}