/*
 * 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.openmeetings.web.user.dashboard;

import static org.apache.openmeetings.rss.LoadAtomRssFeed.getFeedConnection;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_RSS_FEED1_KEY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_RSS_FEED2_KEY;
import static org.apache.openmeetings.web.app.Application.getBean;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;

import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;

import ro.fortsoft.wicket.dashboard.Widget;
import ro.fortsoft.wicket.dashboard.web.WidgetView;

public class RssWidgetView extends WidgetView {
	private static final long serialVersionUID = -6257866996099503210L;
	private RSSFeedBehavior feed1; 
	private RSSFeedBehavior feed2; 

	public RssWidgetView(String id, Model<Widget> model) {
		super(id, model);
		ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
		add(feed1 = new RSSFeedBehavior(cfgDao.getConfValue(CONFIG_RSS_FEED1_KEY, String.class, "")));
		add(feed2 = new RSSFeedBehavior(cfgDao.getConfValue(CONFIG_RSS_FEED2_KEY, String.class, "")));
	}
	
	@Override
	public void renderHead(IHeaderResponse response) {
		super.renderHead(response);
		response.render(OnDomReadyHeaderItem.forScript("loadRssTab('" + feed1.getCallbackUrl() + "',"
				+ "'" + feed2.getCallbackUrl() + "');")) ;
	}
	
	class RSSFeedBehavior extends AbstractAjaxBehavior {
		private static final long serialVersionUID = 721009368063152450L;
		private String url;

		RSSFeedBehavior(String url) {
			this.url = url;
		}
		
		public void onRequest() {
			ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(new AbstractResourceStream() {
				private static final long serialVersionUID = -322593118428697261L;
				HttpURLConnection con;
				
				public InputStream getInputStream() throws ResourceStreamNotFoundException {
					try {
						con = getFeedConnection(url);
						con.connect();
						return con.getInputStream();
					} catch (IOException e) {
						throw new ResourceStreamNotFoundException();
					}
				}

				public void close() throws IOException {
					if (con != null) {
						con.disconnect();
					}
				}
			}, "feed");
			handler.setContentDisposition(ContentDisposition.ATTACHMENT);
			getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
		}
	}
}
