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.sitemanager;
029
030import org.opencms.file.CmsResource;
031import org.opencms.lock.CmsLockException;
032import org.opencms.main.CmsException;
033import org.opencms.main.CmsLog;
034import org.opencms.site.CmsSite;
035import org.opencms.ui.A_CmsUI;
036import org.opencms.ui.CmsVaadinUtils;
037import org.opencms.ui.apps.Messages;
038import org.opencms.ui.components.CmsBasicDialog;
039import org.opencms.ui.components.CmsResourceInfo;
040
041import java.util.ArrayList;
042import java.util.List;
043import java.util.Set;
044
045import org.apache.commons.logging.Log;
046
047import com.vaadin.ui.Button;
048import com.vaadin.ui.Button.ClickEvent;
049import com.vaadin.ui.Button.ClickListener;
050import com.vaadin.v7.shared.ui.label.ContentMode;
051import com.vaadin.v7.ui.CheckBox;
052import com.vaadin.v7.ui.Label;
053import com.vaadin.v7.ui.VerticalLayout;
054
055/**
056 * Dialog for deleting Sites.<p>
057 */
058public class CmsDeleteSiteDialog extends CmsBasicDialog {
059
060    /** The logger for this class. */
061    static Log LOG = CmsLog.getLog(CmsDeleteSiteDialog.class.getName());
062
063    /**vaadin serial id.*/
064    private static final long serialVersionUID = 4861877088383896218L;
065
066    /** The site manager instance.*/
067    CmsSiteManager m_manager;
068
069    /**cancel button.*/
070    private Button m_cancelButton;
071
072    /**check box: should resources be deleted?*/
073    private CheckBox m_deleteResources;
074
075    /**ok button.*/
076    private Button m_okButton;
077
078    /**sites to delete.*/
079    private final List<CmsSite> m_sitesToDelete = new ArrayList<CmsSite>();
080
081    /**
082     * Public constructor.<p>
083     *
084     * @param manager the site manager instance
085     * @param data with values for siteroots to delete.
086     */
087    public CmsDeleteSiteDialog(CmsSiteManager manager, Set<String> data) {
088
089        m_manager = manager;
090
091        for (String site : data) {
092            m_sitesToDelete.add(manager.getElement(site));
093        }
094
095        displayResourceInfoDirectly(getResourceInfos());
096
097        setContent(getContent());
098        m_okButton = new Button(CmsVaadinUtils.getMessageText(org.opencms.workplace.Messages.GUI_DIALOG_BUTTON_OK_0));
099        m_cancelButton = new Button(
100            CmsVaadinUtils.getMessageText(org.opencms.workplace.Messages.GUI_DIALOG_BUTTON_CANCEL_0));
101        addButton(m_okButton);
102        addButton(m_cancelButton);
103        //Set Clicklistener
104        m_cancelButton.addClickListener(new ClickListener() {
105
106            private static final long serialVersionUID = -5769891739879269176L;
107
108            public void buttonClick(ClickEvent event) {
109
110                m_manager.closeDialogWindow(false);
111            }
112        });
113        m_okButton.addClickListener(new ClickListener() {
114
115            private static final long serialVersionUID = 6932464669055039855L;
116
117            public void buttonClick(ClickEvent event) {
118
119                submit();
120                m_manager.closeDialogWindow(true);
121            }
122        });
123    }
124
125    /**
126     * delete sites.<p>
127     */
128    void submit() {
129
130        List<String> siteRootsToDelete = new ArrayList<String>();
131        for (CmsSite site : m_sitesToDelete) {
132
133            String currentSite = A_CmsUI.getCmsObject().getRequestContext().getSiteRoot();
134            if (currentSite.equals(site.getSiteRoot())) {
135                A_CmsUI.getCmsObject().getRequestContext().setSiteRoot("");
136            }
137            siteRootsToDelete.add(site.getSiteRoot());
138        }
139        m_manager.deleteElements(siteRootsToDelete);
140        if (m_deleteResources.getValue().booleanValue()) {
141            for (CmsSite site : m_sitesToDelete) {
142                try {
143                    m_manager.getRootCmsObject().lockResource(site.getSiteRoot());
144                } catch (CmsException e) {
145                    LOG.error("unable to lock resource");
146                }
147                try {
148                    m_manager.getRootCmsObject().deleteResource(
149                        site.getSiteRoot(),
150                        CmsResource.DELETE_PRESERVE_SIBLINGS);
151                    try {
152                        m_manager.getRootCmsObject().unlockResource(site.getSiteRoot());
153                    } catch (CmsLockException e) {
154                        LOG.info("Unlock failed.", e);
155                    }
156                } catch (CmsException e) {
157                    //ok, resource was not published and can not be unlocked anymore..
158                }
159            }
160        }
161    }
162
163    /**
164     * Creates content of dialog containing CheckBox if resources should be deleted and a messages.<p>
165     *
166     * @return vertical layout component.
167     */
168    private VerticalLayout getContent() {
169
170        String message;
171
172        if (m_sitesToDelete.size() == 1) {
173            message = CmsVaadinUtils.getMessageText(
174                Messages.GUI_SITE_CONFIRM_DELETE_SITE_1,
175                m_sitesToDelete.get(0).getTitle());
176        } else {
177            message = "";
178            for (CmsSite site : m_sitesToDelete) {
179                if (message.length() > 0) {
180                    message += ", ";
181                }
182                message += site.getTitle();
183            }
184            message = CmsVaadinUtils.getMessageText(Messages.GUI_SITE_CONFIRM_DELETE_SITES_1, message);
185        }
186
187        VerticalLayout layout = new VerticalLayout();
188
189        m_deleteResources = new CheckBox();
190        m_deleteResources.setCaption(CmsVaadinUtils.getMessageText(Messages.GUI_SITE_DELETE_RESOURCES_0));
191        m_deleteResources.setDescription(CmsVaadinUtils.getMessageText(Messages.GUI_SITE_DELETE_RESOURCES_HELP_0));
192
193        layout.addComponent(m_deleteResources);
194
195        Label label = new Label();
196        label.setContentMode(ContentMode.HTML);
197        label.setValue(message);
198
199        layout.addComponent(label);
200        return layout;
201    }
202
203    /**
204     * Returns a list of CmsResourceInfo objects.<p>
205     *
206     * @return list of cmsresourceinfo.
207     */
208    private List<CmsResourceInfo> getResourceInfos() {
209
210        List<CmsResourceInfo> infos = new ArrayList<CmsResourceInfo>();
211        for (CmsSite site : m_sitesToDelete) {
212            infos.add(
213                new CmsResourceInfo(site.getTitle(), site.getSiteRoot(), m_manager.getFavIcon(site.getSiteRoot())));
214        }
215        return infos;
216    }
217}