// Copyright 2006 Google Inc. // // Licensed 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 com.google.enterprise.connector.servlet; import com.google.common.collect.ImmutableMap; import com.google.enterprise.connector.common.JarUtils; import com.google.enterprise.connector.logging.NDC; import com.google.enterprise.connector.manager.ConnectorStatus; import com.google.enterprise.connector.manager.Context; import com.google.enterprise.connector.manager.Manager; import com.google.enterprise.connector.persist.ConnectorTypeNotFoundException; import com.google.enterprise.connector.scheduler.Schedule; import com.google.enterprise.connector.spi.ConnectorType; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Admin servlet to get a list of connector types. */ public class GetConnectorInstanceList extends HttpServlet { private static final Logger LOGGER = Logger.getLogger(GetConnectorInstanceList.class.getName()); // TODO: Remove this when pre-6.2 GSA's no longer need to be supported. @SuppressWarnings("deprecation") private static final String DEPRECATED_XMLTAG_CONNECTOR_SCHEDULE = ServletUtil.XMLTAG_CONNECTOR_SCHEDULE; /** * Returns a list of connector types. * * @param req * @param res * @throws IOException */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { doPost(req, res); } /** * Returns a list of connector types. * * @param req * @param res * @throws IOException */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { // Make sure this requester is OK if (!RemoteAddressFilter.getInstance() .allowed(RemoteAddressFilter.Access.BLACK, req.getRemoteAddr())) { res.sendError(HttpServletResponse.SC_FORBIDDEN); return; } res.setContentType(ServletUtil.MIMETYPE_XML); PrintWriter out = res.getWriter(); NDC.pushAppend("Config"); try { Manager manager = Context.getInstance().getManager(); handleDoPost(manager, out); } finally { out.close(); NDC.pop(); } } /** * Handler for doGet in order to do unit tests. * * @param manager a Manager * @param out PrintWriter where the response is written */ public static void handleDoPost(Manager manager, PrintWriter out) { ServletUtil.writeRootTag(out, false); ServletUtil.writeManagerSplash(out); List<ConnectorStatus> connectorInstances = manager.getConnectorStatuses(); if (connectorInstances == null || connectorInstances.size() == 0) { ServletUtil.writeStatusId(out, ConnectorMessageCode.RESPONSE_NULL_CONNECTOR); ServletUtil.writeRootTag(out, true); return; } ServletUtil.writeStatusId(out, ConnectorMessageCode.SUCCESS); ServletUtil.writeXMLTag(out, 1, ServletUtil.XMLTAG_CONNECTOR_INSTANCES, false); for (ConnectorStatus connectorStatus : connectorInstances) { ServletUtil.writeXMLTag(out, 2, ServletUtil.XMLTAG_CONNECTOR_INSTANCE, false); ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_CONNECTOR_NAME, connectorStatus.getName()); String typeName = connectorStatus.getType(); ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_CONNECTOR_TYPE, typeName); String version = null; try { ConnectorType connectorType = manager.getConnectorType(typeName); version = JarUtils.getJarVersion(connectorType.getClass()); } catch (ConnectorTypeNotFoundException e) { // The JUnit tests might not have actual ConnectorTypes. LOGGER.warning("Connector type not found: " + typeName); } if (version != null && version.length() > 0) { ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_VERSION, version); } ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_STATUS, Integer .toString(connectorStatus.getStatus())); String schedule = connectorStatus.getSchedule(); if (schedule == null) { LOGGER.log(Level.WARNING, connectorStatus.getName() + ": " + ServletUtil.LOG_RESPONSE_NULL_SCHEDULE); // TODO: Remove this when pre-6.2 GSA's no longer need to be supported. ServletUtil.writeEmptyXMLElement(out, 3, DEPRECATED_XMLTAG_CONNECTOR_SCHEDULE); // Add element using proper tag that can be handled by new GSAs. ServletUtil.writeEmptyXMLElement(out, 3, ServletUtil.XMLTAG_CONNECTOR_SCHEDULES); } else { StringBuilder buffer = new StringBuilder(); // Put out new style Schedules element. ServletUtil.writeXMLTagWithAttrs(buffer, 3, ServletUtil.XMLTAG_CONNECTOR_SCHEDULES, ImmutableMap.of( ServletUtil.ATTRIBUTE_VERSION, Schedule.CURRENT_VERSION), false); buffer.append(schedule); ServletUtil.writeXMLTag(buffer, 0, ServletUtil.XMLTAG_CONNECTOR_SCHEDULES, true); // TODO: Remove this when pre-6.2 GSA's no longer need to be supported. buffer.append('\n'); ServletUtil.writeXMLTagWithAttrs(buffer, 3, DEPRECATED_XMLTAG_CONNECTOR_SCHEDULE, ImmutableMap.of(ServletUtil.ATTRIBUTE_VERSION, "1"), false); buffer.append(Schedule.toLegacyString(schedule)); ServletUtil.writeXMLTag(buffer, 0, DEPRECATED_XMLTAG_CONNECTOR_SCHEDULE, true); out.println(buffer.toString()); } if (connectorStatus.getGlobalNamespace() != null) { ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_GLOBAL_NAMESPACE, connectorStatus.getGlobalNamespace()); } if (connectorStatus.getLocalNamespace() != null) { ServletUtil.writeXMLElement(out, 3, ServletUtil.XMLTAG_LOCAL_NAMESPACE, connectorStatus.getLocalNamespace()); } ServletUtil.writeXMLTag(out, 2, ServletUtil.XMLTAG_CONNECTOR_INSTANCE, true); } ServletUtil.writeXMLTag(out, 1, ServletUtil.XMLTAG_CONNECTOR_INSTANCES, true); ServletUtil.writeRootTag(out, true); } }