/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.admin;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.zip.GZIPInputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.core.Configuration;
import org.projectforge.core.ConfigurationDO;
import org.projectforge.core.ConfigurationDao;
import org.projectforge.core.ConfigurationParam;
import org.projectforge.core.HibernateSearchReindexer;
import org.projectforge.database.InitDatabaseDao;
import org.projectforge.database.MyDatabaseUpdater;
import org.projectforge.database.XmlDump;
import org.projectforge.database.xstream.XStreamSavingConverter;
import org.projectforge.task.TaskTree;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.UserGroupCache;
import org.projectforge.web.LoginPage;
import org.projectforge.web.MenuItemRegistry;
import org.projectforge.web.UserFilter;
import org.projectforge.web.wicket.AbstractUnsecureBasePage;
import org.projectforge.web.wicket.MessagePage;
import org.projectforge.web.wicket.MySession;
import org.projectforge.web.wicket.WicketUtils;
public class SetupPage extends AbstractUnsecureBasePage
{
private static final long serialVersionUID = 9174903871130640690L;
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(SetupPage.class);
@SpringBean(name = "initDatabaseDao")
private InitDatabaseDao initDatabaseDao;
@SpringBean(name = "configurationDao")
private ConfigurationDao configurationDao;
@SpringBean(name = "hibernateSearchReindexer")
private HibernateSearchReindexer hibernateSearchReindexer;
@SpringBean(name = "taskTree")
private TaskTree taskTree;
@SpringBean(name = "userGroupCache")
private UserGroupCache userGroupCache;
@SpringBean(name = "myDatabaseUpdater")
private MyDatabaseUpdater myDatabaseUpdater;
@SpringBean(name = "xmlDump")
private XmlDump xmlDump;
private final SetupForm setupForm;
private final SetupImportForm importForm;
public SetupPage(final PageParameters parameters)
{
super(parameters);
checkAccess();
setupForm = new SetupForm(this);
body.add(setupForm);
setupForm.init();
importForm = new SetupImportForm(this);
body.add(importForm);
importForm.init();
// final StringBuffer js = new StringBuffer("<script>\n") //
// .append("$(function() {") //
// .append(" $('input:file').uniform({\n") //
// .append(" fileDefaultText : '- No file selected',\n") //
// .append(" fileBtnText : 'Choose - File'\n") //
// .append(" }); });\n") //
// .append("alert('Hurzel');") //
// .append("</script>\n");
// body.add(new Label("uploadScript", js.toString()).setEscapeModelStrings(false));
}
protected void finishSetup()
{
log.info("Finishing the set-up...");
checkAccess();
PFUserDO adminUser = null;
final String message;
if (setupForm.getSetupMode() == SetupTarget.EMPTY_DATABASE) {
adminUser = initDatabaseDao.initializeEmptyDatabase(setupForm.getAdminUser(), setupForm.getTimeZone());
message = "administration.setup.message.emptyDatabase";
} else {
adminUser = initDatabaseDao.initializeEmptyDatabaseWithTestData(setupForm.getAdminUser(), setupForm.getTimeZone());
message = "administration.setup.message.testdata";
// refreshes the visibility of the costConfigured dependent menu items:
Configuration.getInstance().setExpired(); // Force reload.
MenuItemRegistry.instance().refresh();
}
((MySession) getSession()).login(adminUser, getRequest());
UserFilter.login(WicketUtils.getHttpServletRequest(getRequest()), adminUser);
configurationDao.checkAndUpdateDatabaseEntries();
if (setupForm.getTimeZone() != null) {
final ConfigurationDO configurationDO = getConfigurationDO(ConfigurationParam.DEFAULT_TIMEZONE);
if (configurationDO != null) {
configurationDO.setTimeZone(setupForm.getTimeZone());
configurationDao.update(configurationDO);
}
}
configure(ConfigurationParam.CALENDAR_DOMAIN, setupForm.getCalendarDomain());
configure(ConfigurationParam.SYSTEM_ADMIN_E_MAIL, setupForm.getSysopEMail());
configure(ConfigurationParam.FEEDBACK_E_MAIL, setupForm.getFeedbackEMail());
if (myDatabaseUpdater.getSystemUpdater().isUpdated() == true) {
// Update status:
UserFilter.setUpdateRequiredFirst(false);
}
setResponsePage(new MessagePage(message, adminUser.getUsername()));
log.info("Set-up finished.");
}
private ConfigurationDO getConfigurationDO(final ConfigurationParam param)
{
final ConfigurationDO configurationDO = configurationDao.getEntry(param);
if (configurationDO == null) {
log.error("Oups, can't find configuration parameter '" + param + "'. You can re-configure it anytime later.");
}
return configurationDO;
}
private void configure(final ConfigurationParam param, final String value)
{
if (StringUtils.isBlank(value) == true) {
return;
}
final ConfigurationDO configurationDO = getConfigurationDO(param);
if (configurationDO != null) {
configurationDO.setStringValue(value);
configurationDao.update(configurationDO);
}
}
protected void upload()
{
checkAccess();
log.info("Uploading data-base dump file...");
final FileUpload fileUpload = importForm.fileUploadField.getFileUpload();
if (fileUpload == null) {
return;
}
try {
final String clientFileName = fileUpload.getClientFileName();
Reader reader = null;
if (clientFileName.endsWith(".xml.gz") == true) {
reader = new InputStreamReader(new GZIPInputStream(fileUpload.getInputStream()));
} else if (clientFileName.endsWith(".xml") == true) {
reader = new InputStreamReader(fileUpload.getInputStream());
} else {
log.info("Unsupported file suffix. Only *.xml and *.xml.gz is supported: " + clientFileName);
error(getString("administration.setup.error.uploadfile"));
return;
}
final XStreamSavingConverter converter = xmlDump.restoreDatabase(reader);
final int counter = xmlDump.verifyDump(converter);
configurationDao.checkAndUpdateDatabaseEntries();
Configuration.getInstance().setExpired();
taskTree.setExpired();
userGroupCache.setExpired();
new Thread() {
@Override
public void run()
{
hibernateSearchReindexer.rebuildDatabaseSearchIndices();
}
}.start();
if (counter > 0) {
((MySession) getSession()).logout();
setResponsePage(LoginPage.class);
} else {
error(getString("administration.setup.error.import"));
}
} catch (final Exception ex) {
log.error(ex.getMessage(), ex);
error(getString("administration.setup.error.import"));
}
}
@Override
protected String getTitle()
{
return getString("administration.setup.title");
}
private void checkAccess()
{
if (initDatabaseDao.isEmpty() == false) {
log.error("Couldn't call set-up page, because the data-base isn't empty!");
((MySession) getSession()).logout();
throw new RestartResponseException(WicketUtils.getDefaultPage());
}
}
/**
* @see org.projectforge.web.wicket.AbstractUnsecureBasePage#thisIsAnUnsecuredPage()
*/
@Override
protected void thisIsAnUnsecuredPage()
{
}
}