/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */

package org.apache.roller.weblogger.ui.struts2.editor;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.util.RollerConstants;
import org.apache.roller.weblogger.business.BookmarkManager;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.ui.struts2.util.UIAction;
import org.apache.roller.weblogger.util.cache.CacheManager;
import org.apache.struts2.convention.annotation.AllowedMethods;


/**
 * Import opml file into bookmarks folder.
 */
// TODO: make this work @AllowedMethods({"execute","save"})
public final class BookmarksImport extends UIAction {
    
    private static Log log = LogFactory.getLog(BookmarksImport.class);
    
    // only write files out that are below this threshold
    private static final long WRITE_THRESHOLD_IN_MB = 4;
    private static final long WRITE_THRESHOLD = WRITE_THRESHOLD_IN_MB * 1024000;

    // uploaded opml file
    private File opmlFile = null;
    
    // content type of uploaded file
    private String opmlFileContentType = null;
    
    // file name of uploaded file
    private String opmlFileFileName = null;
    
    
    public BookmarksImport() {
        this.actionName = "bookmarksImport";
        this.desiredMenu = "editor";
        this.pageTitle = "bookmarksImport.title";
    }

    /**
     * Request to import bookmarks
     */
    public String execute() {
        return INPUT;
    }

    /**
     * Save imported bookmarks.
     */
    public String save() {
        
        BookmarkManager bm = WebloggerFactory.getWeblogger().getBookmarkManager();
        
        InputStream stream = null;
        if(getOpmlFile() != null && getOpmlFile().exists()) {
            try {
                //only write files out that are less than 4MB
                if (getOpmlFile().length() < WRITE_THRESHOLD) {

                    stream = new FileInputStream(getOpmlFile());
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();

                    byte[] buffer = new byte[RollerConstants.EIGHT_KB_IN_BYTES];
                    int bytesRead = 0;
                    while ((bytesRead=stream.read(buffer,0,RollerConstants.EIGHT_KB_IN_BYTES)) != -1) {
                        baos.write(buffer, 0, bytesRead);
                    }
                    String data = new String(baos.toByteArray());

                    SimpleDateFormat formatter =
                            new SimpleDateFormat("yyyyMMddHHmmss");
                    Date now = new Date();
                    String folderName = "imported-" + formatter.format(now);

                    // Use Roller BookmarkManager to import bookmarks
                    bm.importBookmarks(getActionWeblog(), folderName, data);
                    WebloggerFactory.getWeblogger().flush();

                    // notify caches
                    CacheManager.invalidate(getActionWeblog());

                    // message to user
                    addMessage("bookmarksImport.imported", folderName);

                    // destroy the temporary file created
                    getOpmlFile().delete();

                    return SUCCESS;

                } else {
                    String data = "The file is greater than " + WRITE_THRESHOLD_IN_MB
                            +" MB, and has not been written to stream."
                            +" File Size: " + getOpmlFile().length() + " bytes. "
                            +" This is a limitation of this particular "
                            +" web application";
                    addError("bookmarksImport.error", data);
                }
            } catch (Exception ex) {
                log.error("ERROR: importing bookmarks", ex);
                addError("bookmarksImport.error", ex.toString());
            } finally {
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (Exception e) {
                        log.error("Closing stream",e);
                    }
                }
            }
        }
        return INPUT;
    }
    
    
    public File getOpmlFile() {
        return opmlFile;
    }
    
    public void setOpmlFile(File opmlFile) {
        this.opmlFile = opmlFile;
    }
    
    public String getOpmlFileContentType() {
        return opmlFileContentType;
    }
    
    public void setOpmlFileContentType(String opmlFileContentType) {
        this.opmlFileContentType = opmlFileContentType;
    }
    
    public String getOpmlFileFileName() {
        return opmlFileFileName;
    }
    
    public void setOpmlFileFileName(String opmlFileFileName) {
        this.opmlFileFileName = opmlFileFileName;
    }
    
}
