/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.server.webapp.war.pages;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.osgi.framework.Bundle;
import org.springframework.osgi.web.deployer.support.DefaultContextPathStrategy;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.server.webapp.pages.BasePage;
import eu.esdihumboldt.hale.server.webapp.util.PageDescription;
import eu.esdihumboldt.hale.server.webapp.war.internal.Activator;
/**
* The main page for the administration interface. War bundles will be listed
* (except the this bundle and other bundles where it is not appropriate)
* according to their name specified by the <code>Webapp-Name</code> MANIFEST.MF
* header. Bundles having the <code>Webapp-Hide</code> header set to
* <code>true</code> will not be listed on the welcome page.
*
* @author Michel Kraemer
*/
@PageDescription(title = "Home", root = true)
public class WelcomePage extends BasePage {
private static final long serialVersionUID = 4112352006256827014L;
/**
* Header keys
*/
private static final String WEBAPP_NAME = "Webapp-Name";
private static final String WEBAPP_HIDE = "Webapp-Hide";
private static final String BUNDLE_NAME = "Bundle-Name";
/**
* log4j Logger
*/
private static final ALogger _log = ALoggerFactory.getLogger(WelcomePage.class);
/**
* Information about a war bundle
*/
private static class BundleInfo {
String path;
String name;
}
/**
* Default constructor
*/
public WelcomePage() {
// nothing to do here
}
@Override
protected void addControls(boolean loggedIn) {
super.addControls(loggedIn);
// create a model which loads the list of war bundles dynamically
IModel<List<BundleInfo>> listViewModel = new LoadableDetachableModel<List<BundleInfo>>() {
private static final long serialVersionUID = 8919477639656535497L;
@Override
protected List<BundleInfo> load() {
// get context paths of other war bundles
List<BundleInfo> wars = new ArrayList<BundleInfo>();
Activator aa = Activator.getInstance();
DefaultContextPathStrategy s = new DefaultContextPathStrategy();
for (Bundle b : aa.getWarBundles()) {
if (isHidden(b)) {
continue;
}
BundleInfo bi = new BundleInfo();
bi.name = getHumanReadableName(b);
bi.path = s.getContextPath(b);
wars.add(bi);
}
// sort list
Collections.sort(wars, new Comparator<BundleInfo>() {
@Override
public int compare(BundleInfo o1, BundleInfo o2) {
return o1.name.compareTo(o2.name);
}
});
return wars;
}
};
// fill list view
ListView<BundleInfo> lv = new ListView<BundleInfo>("applications", listViewModel) {
private static final long serialVersionUID = -3861139762631118268L;
@Override
protected void populateItem(ListItem<BundleInfo> item) {
BundleInfo bi = item.getModelObject();
item.add(new ExternalLink("path", bi.path, bi.name));
}
};
add(lv);
}
/**
* Returns a bundle name that can be viewed on the welcome page
*
* @param b the bundle
* @return the bundle's name
*/
private static String getHumanReadableName(Bundle b) {
String name = b.getHeaders().get(WEBAPP_NAME);
if (name == null) {
_log.warn("Bundle " + b.getSymbolicName() + " has no " + "\"" + WEBAPP_NAME
+ "\" header defined. Using " + "\"" + BUNDLE_NAME + "\"");
name = b.getHeaders().get(BUNDLE_NAME);
}
return name;
}
/**
* Checks if a bundle should be listed on the welcome page
*
* @param b the bundle
* @return true if the bundle is hidden, false if it should be listed
*/
private static boolean isHidden(Bundle b) {
String hide = b.getHeaders().get(WEBAPP_HIDE);
return Boolean.parseBoolean(hide);
}
}