001/*
002 * This library is part of OpenCms -
003 * the Open Source Content Management System
004 *
005 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * For further information about Alkacon Software, please see the
018 * company website: http://www.alkacon.com
019 *
020 * For further information about OpenCms, please see the
021 * project website: http://www.opencms.org
022 *
023 * You should have received a copy of the GNU Lesser General Public
024 * License along with this library; if not, write to the Free Software
025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
026 */
027
028package org.opencms.ui.apps.sessions;
029
030import org.opencms.configuration.CmsVariablesConfiguration;
031import org.opencms.db.CmsLoginMessage;
032import org.opencms.main.CmsLog;
033import org.opencms.main.OpenCms;
034import org.opencms.ui.A_CmsUI;
035import org.opencms.ui.CmsVaadinUtils;
036import org.opencms.ui.apps.Messages;
037import org.opencms.ui.components.CmsBasicDialog;
038import org.opencms.ui.components.CmsDateField;
039import org.opencms.ui.components.CmsRichTextArea;
040
041import java.util.Date;
042
043import org.apache.commons.logging.Log;
044
045import com.vaadin.data.Binder;
046import com.vaadin.ui.Button;
047import com.vaadin.ui.Button.ClickEvent;
048import com.vaadin.ui.Button.ClickListener;
049import com.vaadin.ui.CheckBox;
050import com.vaadin.ui.TabSheet;
051import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
052import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
053import com.vaadin.ui.Window;
054
055/**
056 * Class for the Edit Login View.<p>
057 */
058public class CmsEditLoginView extends CmsBasicDialog {
059
060    /** The logger for this class. */
061    static Log LOG = CmsLog.getLog(CmsEditLoginView.class.getName());
062
063    /**vaadin serial ok.*/
064    private static final long serialVersionUID = -1053691437033852491L;
065
066    /**vaadin component.*/
067    private Button m_cancel;
068
069    /**vaadin component.*/
070    private CheckBox m_enabledAfter;
071
072    /**vaadin component.*/
073    private CheckBox m_enabledBefore;
074
075    /**date field.*/
076    private CmsDateField m_endTimeAfter;
077
078    /** The form field binder. */
079    private Binder<CmsLoginMessage> m_formBinderAfter;
080
081    /** The form field binder. */
082    private Binder<CmsLoginMessage> m_formBinderBefore;
083
084    /**Vaadin component. */
085    private TabSheet m_tab;
086
087    /**vaadin component.*/
088    private CheckBox m_logoutAfter;
089
090    /**vaadin component.*/
091    protected CmsRichTextArea m_messageAfter;
092
093    /**vaadin component.*/
094    protected CmsRichTextArea m_messageBefore;
095
096    /**vaadin component.*/
097    private Button m_ok;
098
099    /**date field.*/
100    private CmsDateField m_startTimeAfter;
101
102    /**
103     * Public constructor.<p>
104     *
105     * @param window to be closed
106     */
107    public CmsEditLoginView(final Window window) {
108
109        CmsVaadinUtils.readAndLocalizeDesign(this, CmsVaadinUtils.getWpMessagesForCurrentLocale(), null);
110        setHeight("100%");
111        bindFields();
112
113        CmsLoginMessage message = OpenCms.getLoginManager().getLoginMessage();
114        if (message == null) {
115            message = new CmsLoginMessage();
116        }
117
118        m_formBinderAfter.readBean(message);
119        if (!message.isEnabled()) {
120            m_endTimeAfter.setValue(null);
121            m_startTimeAfter.setValue(null);
122        }
123        CmsLoginMessage messageBefore = OpenCms.getLoginManager().getBeforeLoginMessage();
124        if (messageBefore == null) {
125            messageBefore = new CmsLoginMessage();
126        }
127        m_formBinderBefore.readBean(messageBefore);
128
129        m_cancel.addClickListener(new ClickListener() {
130
131            private static final long serialVersionUID = 4425001638229366505L;
132
133            public void buttonClick(ClickEvent event) {
134
135                window.close();
136            }
137
138        });
139
140        m_ok.addClickListener(new Button.ClickListener() {
141
142            private static final long serialVersionUID = 5512397920545155478L;
143
144            public void buttonClick(ClickEvent event) {
145
146                if (isFormValid()) {
147                    submit();
148                    window.close();
149                }
150
151            }
152        });
153        m_messageAfter.setFontStyle();
154        m_messageBefore.setFontStyle();
155        m_tab.addSelectedTabChangeListener(new SelectedTabChangeListener() {
156
157            public void selectedTabChange(SelectedTabChangeEvent event) {
158
159                m_messageAfter.setFontStyle();
160                m_messageBefore.setFontStyle();
161
162            }
163
164        });
165    }
166
167    /**
168     * Gets end time from formular.<p>
169     *
170     * @return time as long
171     */
172    protected long getEnd() {
173
174        if (m_endTimeAfter.getValue() == null) {
175            return 0;
176        }
177        return m_endTimeAfter.getDate().getTime();
178    }
179
180    /**
181     * Gets start time from formular.<p>
182     *
183     * @return time as long
184     */
185    protected long getStart() {
186
187        if (m_startTimeAfter.getValue() == null) {
188            return 0;
189        }
190        return m_startTimeAfter.getDate().getTime();
191    }
192
193    /**
194     * Checks if formular is valid.<p>
195     *
196     * @return true if all fields are ok
197     */
198    protected boolean isFormValid() {
199
200        // return m_startTimeAfter.isValid() & m_endTimeAfter.isValid() & m_messageAfter.isValid();
201        return !m_formBinderAfter.validate().hasErrors();
202    }
203
204    /**
205     * Saves the settings.<p>
206     */
207    protected void submit() {
208
209        CmsLoginMessage loginMessage = new CmsLoginMessage();
210        CmsLoginMessage beforeLoginMessage = new CmsLoginMessage();
211        try {
212            m_formBinderAfter.writeBean(loginMessage);
213            m_formBinderBefore.writeBean(beforeLoginMessage);
214            OpenCms.getLoginManager().setLoginMessage(A_CmsUI.getCmsObject(), loginMessage);
215            OpenCms.getLoginManager().setBeforeLoginMessage(A_CmsUI.getCmsObject(), beforeLoginMessage);
216            // update the system configuration
217            OpenCms.writeConfiguration(CmsVariablesConfiguration.class);
218        } catch (Exception e) {
219            LOG.error("Unable to save Login Message", e);
220        }
221    }
222
223    /**
224     * Checks whether the entered start end end times are valid.<p>
225     *
226     * @return <code>true</code> in case the times are valid
227     */
228    boolean hasValidTimes() {
229
230        if ((getEnd() > 0L) && (getEnd() < System.currentTimeMillis())) {
231            return false;
232        }
233
234        return ((getEnd() == 0) | (getStart() == 0)) || (getEnd() >= getStart());
235    }
236
237    /**
238     * Binds the form fields.<p>
239     */
240    private void bindFields() {
241
242        m_formBinderAfter = new Binder<>();
243        m_formBinderAfter.bind(m_messageAfter, CmsLoginMessage::getMessage, CmsLoginMessage::setMessage);
244
245        m_formBinderAfter.bind(
246            m_enabledAfter,
247            loginMessage -> Boolean.valueOf(loginMessage.isEnabled()),
248            (loginMessage, enabled) -> loginMessage.setEnabled(enabled.booleanValue()));
249
250        m_formBinderAfter.bind(
251            m_logoutAfter,
252            loginMessage -> Boolean.valueOf(loginMessage.isLoginForbidden()),
253            (loginMessage, forbidden) -> loginMessage.setLoginForbidden(forbidden.booleanValue()));
254
255        m_formBinderAfter.forField(m_endTimeAfter).withValidator(
256            endTime -> hasValidTimes(),
257            CmsVaadinUtils.getMessageText(Messages.GUI_MESSAGES_LOGINMESSAGE_VAL_DATE_0)).bind(
258                loginMessage -> loginMessage.getTimeEnd() != CmsLoginMessage.DEFAULT_TIME_END
259                ? CmsDateField.dateToLocalDateTime(new Date(loginMessage.getTimeEnd()))
260                : null,
261                (loginMessage, endTime) -> loginMessage.setTimeEnd(
262                    endTime != null
263                    ? CmsDateField.localDateTimeToDate(endTime).getTime()
264                    : CmsLoginMessage.DEFAULT_TIME_END));
265        m_formBinderAfter.forField(m_startTimeAfter).withValidator(
266            startTime -> hasValidTimes(),
267            CmsVaadinUtils.getMessageText(Messages.GUI_MESSAGES_LOGINMESSAGE_VAL_DATE_0)).bind(
268                loginMessage -> loginMessage.getTimeStart() != CmsLoginMessage.DEFAULT_TIME_START
269                ? CmsDateField.dateToLocalDateTime(new Date(loginMessage.getTimeStart()))
270                : null,
271                (loginMessage, startTime) -> loginMessage.setTimeStart(
272                    startTime != null
273                    ? CmsDateField.localDateTimeToDate(startTime).getTime()
274                    : CmsLoginMessage.DEFAULT_TIME_START));
275        m_formBinderBefore = new Binder<>();
276        m_formBinderBefore.bind(m_messageBefore, CmsLoginMessage::getMessage, CmsLoginMessage::setMessage);
277
278        m_formBinderBefore.bind(
279            m_enabledBefore,
280            loginMessage -> Boolean.valueOf(loginMessage.isEnabled()),
281            (loginMessage, enabled) -> loginMessage.setEnabled(enabled.booleanValue()));
282    }
283}