/*
Copyright (C) 2016 maik.jablonski@jease.org
This program 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, either version 3 of the License, or
(at your option) any later version.
This program 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 jease.cms.web;
import java.util.Date;
import java.util.stream.Stream;
import jease.Names;
import jease.cmf.service.Nodes;
import jease.cmf.web.JeaseSession;
import jease.cms.domain.Factory;
import jease.cms.domain.Folder;
import jease.cms.domain.Parameter;
import jease.cms.domain.Role;
import jease.cms.domain.Script;
import jease.cms.domain.Text;
import jease.cms.domain.Transit;
import jease.cms.domain.User;
import jease.cms.service.Contents;
import jease.cms.service.Users;
import jease.cms.web.user.Editor;
import jfix.db4o.Database;
import jfix.util.I18N;
import jfix.zk.Div;
import jfix.zk.Window;
import jfix.zk.ZK;
import org.zkoss.zk.ui.event.Events;
/**
* Initial setup and upgrade for JeaseCMS.
*/
public class Setup extends Div {
public Setup() {
init();
}
public void init() {
setupParameter();
setupContent();
setupRoles();
setupAdministrator();
}
public void setupParameter() {
if (Database.query(Parameter.class).isEmpty()) {
for (Parameter parameter : new Parameter[] {
new Parameter(Names.JEASE_SITE_DESIGN, "simple"),
new Parameter(Names.JEASE_REVISION_COUNT, "10"),
new Parameter(Names.JEASE_REVISION_DAYS, "30") }) {
Database.save(parameter);
}
}
}
public void setupContent() {
if (Nodes.getRoot() == null) {
Folder folder = new Folder();
folder.setId("");
folder.setTitle(I18N.get("JeaseCMS"));
folder.setLastModified(new Date());
folder.setVisible(true);
Nodes.setRoot(folder);
Nodes.save(folder);
Text text = new Text();
text.setId("index.html");
text.setTitle("Welcome to Jease!");
text.setContent("<h2>This page was automatically created by the setup process.</h2><p>Feel free to <i>edit</i> or <b>delete</b> it.</p>");
text.setLastModified(new Date());
text.setParent(folder);
Nodes.save(text);
}
}
public void setupRoles() {
if (Database.query(Role.class).isEmpty()) {
Role administrator = new Role();
administrator.setName(I18N.get("Administrator"));
administrator.setAdministrator(true);
administrator.setTypes(Contents.getClassNamesForAvailableTypes());
Database.save(administrator);
Role editor = new Role();
editor.setName(I18N.get("Editor"));
editor.setTypes(Stream
.of(Contents.getClassNamesForAvailableTypes())
.filter(type ->
!(type.equals(Factory.class.getName())
|| type.equals(Script.class.getName())
|| type.equals(Transit.class.getName()))
)
.toArray(String[]::new));
Database.save(editor);
}
}
public void setupAdministrator() {
if (Users.queryAdministrators().isEmpty()) {
Role admin = Database.queryUnique(Role.class, role -> role
.getName().equals(I18N.get("Administrator")));
final User administrator = new User();
administrator.setRole(admin);
administrator.setRoots(new Folder[] { (Folder) Nodes.getRoot() });
final Window window = new Window(I18N.get("Setup_Administrator"));
window.setClosable(false);
window.setParent(getRoot());
final Editor editor = new Editor();
editor.setObject(administrator);
editor.addEventListener(Events.ON_CHANGE, event -> {
window.close();
JeaseSession.set(administrator);
redirectToLogin();
});
editor.refresh();
editor.setParent(window);
} else {
redirectToLogin();
}
}
public void redirectToLogin() {
ZK.redirect("/cms");
}
}