/*******************************************************************************
 * Copyright (c) 2009, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ua.tests.help.remote;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;

import org.eclipse.help.internal.index.Index;
import org.eclipse.help.internal.index.IndexContribution;
import org.eclipse.help.internal.webapp.data.UrlUtil;
import org.eclipse.help.internal.webapp.servlet.IndexServlet;
import org.eclipse.ua.tests.help.other.UserIndex;
import org.eclipse.ua.tests.help.other.UserIndexEntry;
import org.eclipse.ua.tests.help.other.UserTopic;

public class MockIndexServlet extends IndexServlet {

	private static final long serialVersionUID = -930969620357059313L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String locale = UrlUtil.getLocale(req, resp);
		String response;
		req.setCharacterEncoding("UTF-8"); //$NON-NLS-1$
		resp.setContentType("application/xml; charset=UTF-8"); //$NON-NLS-1$

		IndexContribution[] contributions = getIndex(req, locale);
		try {
			response = serialize(contributions, locale);
		} catch (TransformerException e) {
			throw new ServletException(e);
		}
		resp.getWriter().write(response);
	}

	private IndexContribution[] getIndex(HttpServletRequest req, String locale) {
		int port = req.getLocalPort();
		UserIndex index = new UserIndex(true);
		UserIndexEntry entry1 = new UserIndexEntry("entry1_" + locale, false);
		UserTopic topic1 = new UserTopic("topic1_", "href.html", false);
		index.addEntry(entry1);
		entry1.addTopic(topic1);
		UserIndexEntry entry2 = new UserIndexEntry("entry2_" + locale, false);
		UserTopic topic2 = new UserTopic("topic2_"  + port, "href" + port + ".html", false);
		index.addEntry(entry2);
		entry2.addTopic(topic2);
		IndexContribution contribution = new IndexContribution();
		contribution.setId("mock.index");
		contribution.setIndex(new Index(index));
		contribution.setLocale(locale);
		return new IndexContribution[] { contribution };
	}

}


