net.duckling.ddl.web.controller.pan.PanFileMoveController.java Source code

Java tutorial

Introduction

Here is the source code for net.duckling.ddl.web.controller.pan.PanFileMoveController.java

Source

/*
 * Copyright (c) 2008-2016 Computer Network Information Center (CNIC), Chinese Academy of Sciences.
 * 
 * This file is part of Duckling project.
 *
 * Licensed 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. 
 *
 */
package net.duckling.ddl.web.controller.pan;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.duckling.ddl.common.VWBSession;
import net.duckling.ddl.constant.LynxConstants;
import net.duckling.ddl.service.pan.PanAclUtil;
import net.duckling.ddl.service.url.URLGenerator;
import net.duckling.ddl.service.url.UrlPatterns;
import net.duckling.ddl.service.user.AoneUserService;
import net.duckling.ddl.service.user.SimpleUser;
import net.duckling.ddl.util.JsonUtil;
import net.duckling.ddl.web.interceptor.access.RequirePermission;
import net.duckling.meepo.api.IPanService;
import net.duckling.meepo.api.PanAcl;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import cn.cnic.cerc.dlog.client.WebLog;

import com.meepotech.sdk.MeePoException;
import com.meepotech.sdk.MeePoException.AlreadyExists;
import com.meepotech.sdk.MeePoMeta;

@Controller
@RequirePermission(authenticated = true)
@RequestMapping("/pan/fileMove")
public class PanFileMoveController {
    private static final Logger LOG = Logger.getLogger(PanFileMoveController.class);
    private static final int SUCCESS = 0;
    private static final int WARNING = 1;
    private static final int ERROR = 2;

    @Autowired
    private IPanService service;
    @Autowired
    private URLGenerator urlGenerator;
    @Autowired
    private AoneUserService aoneUserService;

    @WebLog(method = "PanMove", params = "originalRid,targetRid")
    @RequestMapping(params = "func=move")
    public void moveFileTo(HttpServletRequest request, HttpServletResponse response,
            @RequestParam("originalRid") String originalRid, @RequestParam("targetRid") String targetRid) {
        originalRid = decode(originalRid);
        targetRid = decode(targetRid);
        if (isMovingToParent(originalRid, targetRid)) {
            writeResponse(response, WARNING, "??");
            return;
        }
        if (originalRid.equals(targetRid)) { // 1.?
            writeResponse(response, ERROR, "?");
            return;
        }
        if (isMovingToDescendant(originalRid, targetRid)) {
            writeResponse(response, WARNING, "??");
            return;
        }
        try {
            MeePoMeta org = service.ls(PanAclUtil.getInstance(request), originalRid, false);
            boolean result = service.mv(PanAclUtil.getInstance(request), originalRid, targetRid);
            if (result) {

                String url = urlGenerator.getAbsoluteURL(UrlPatterns.PAN_VIEW, encode(targetRid), null);
                int index = targetRid.lastIndexOf("/") + 1;
                String targetPathString = targetRid.substring(index);
                writeResponse(response, SUCCESS, "" + org.name + "?? <a href=\"" + url
                        + "\">" + getMoveTargName(targetPathString) + "</a>");
            } else {
                writeResponse(response, ERROR, "");
            }
        } catch (MeePoException e) {
            String message = "";
            if (e instanceof AlreadyExists) {
                message = "?";
            }
            writeResponse(response, ERROR, message);
            LOG.error("", e);
        }
    }

    private String getMoveTargName(String name) {
        if (StringUtils.isEmpty(name)) {
            return "";
        } else {
            return name;
        }
    }

    private boolean isMovingToDescendant(String originalRid, String targetRid) {
        return targetRid.startsWith(originalRid + "/");
    }

    private boolean isMovingToParent(String originalRid, String targetRid) {
        int index = originalRid.lastIndexOf("/");
        String orPar = originalRid.substring(0, index);
        return targetRid.equals(orPar);
    }

    @WebLog(method = "PanMoves", params = "originalRids,targetRid")
    @RequestMapping(params = "func=moveSelected")
    public void moveSelected(HttpServletRequest request, HttpServletResponse response,
            @RequestParam("originalRids") String originalRidsString, @RequestParam("targetRid") String targetRid) {
        targetRid = decode(targetRid);
        String[] originalRidsStrings = originalRidsString.split(",");
        if (originalRidsStrings == null || originalRidsStrings.length == 0) {
            writeResponse(response, ERROR, "?");
            return;
        }
        if (originalRidsStrings.length == 1) {
            //?
            moveFileTo(request, response, originalRidsStrings[0], targetRid);
            return;
        }
        List<String> originalRids = new ArrayList<String>();
        for (String s : originalRidsStrings) {
            originalRids.add(decode(s));
        }
        // ?????
        List<String> ridsToMove = new ArrayList<String>();
        for (int originalRidIndex = 0; originalRidIndex < originalRids.size(); originalRidIndex++) {
            if (!isMovingToParent(originalRids.get(originalRidIndex), targetRid)) {
                ridsToMove.add(originalRids.get(originalRidIndex));
            }
        }
        if (ridsToMove.size() != originalRids.size()) {
            originalRids = ridsToMove;
        }
        if (originalRids.size() == 0) {
            writeResponse(response, WARNING, "");
            return;
        }
        for (String originalRid : originalRids) {
            if (originalRid.equals(targetRid)) { // 1.?
                writeResponse(response, ERROR, "?");
                return;
            }

            // 2.??
            for (String originalRidd : originalRids) {
                if (isMovingToDescendant(originalRidd, targetRid)) {
                    writeResponse(response, ERROR, "??");
                    return;
                }
            }
        }
        PanAcl panAcl = PanAclUtil.getInstance(request);
        int count = 0;
        for (String rid : originalRids) {
            try {
                boolean result = service.mv(panAcl, rid, targetRid);
                if (!result) {
                    count++;
                }
            } catch (MeePoException e) {
                count++;
                LOG.error("", e);
            }
        }
        String url = urlGenerator.getAbsoluteURL(UrlPatterns.PAN_VIEW, targetRid, null);
        int index = targetRid.lastIndexOf("/") + 1;
        String targetPathString = targetRid.substring(index);
        if (count == 0) {
            writeResponse(response, SUCCESS, "? <a href=\"" + url + "\">"
                    + getMoveTargName(targetPathString) + "</a>");
        } else if (count == originalRids.size()) {
            writeResponse(response, ERROR, "?");
        } else {
            writeResponse(response, WARNING, "? <a href=\"" + url + "\">"
                    + getMoveTargName(targetPathString) + "</a>");
        }
    }

    private String decode(String s) {
        try {
            return URLDecoder.decode(s, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }

    private String encode(String s) {
        try {
            return URLEncoder.encode(s, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return s;
        }
    }

    private static void writeResponse(HttpServletResponse response, int state, String message) {
        JSONObject msg = new JSONObject();
        msg.put("state", state);
        msg.put("msg", message);
        JsonUtil.writeJSONObject(response, msg);
    }

    @WebLog(method = "moveList", params = "rid,originalRid")
    @RequestMapping(params = "func=list")
    public void list(HttpServletRequest request, HttpServletResponse response, @RequestParam("rid") String rid,
            @RequestParam("originalRid") String originalRid) {
        originalRid = decode(originalRid);
        if ("/".equals(rid)) {
            // ??
            JSONArray rootArray = new JSONArray();
            JSONObject rootJsonObject = new JSONObject();
            rootJsonObject.put("data", "");
            JSONObject attr = new JSONObject();
            attr.put("rid", "node_/");
            rootJsonObject.put("attr", attr);
            // root?
            JSONArray childrenJson = new JSONArray();
            try {
                PanAcl panAcl = PanAclUtil.getInstance(request);
                MeePoMeta root = service.ls(panAcl, rid, true);
                List<PanResourceBean> childrenList = getChildren(root,
                        aoneUserService.getSimpleUserByUid(VWBSession.getCurrentUid(request)));
                if (childrenList.isEmpty()) {
                    attr.put("rel", "default");
                } else {
                    String ridToDeal = null;
                    if (StringUtils.isNotEmpty(originalRid)) {
                        List<PanResourceBean> parentResources = getResourcePath(originalRid);
                        if (parentResources.size() > 1) {
                            ridToDeal = parentResources.get(0).getRid();
                            PanResourceBean lastResource = parentResources.get(parentResources.size() - 2);
                            JSONArray lastJsonArray = getChildrenJSONArray(lastResource.getRid(), panAcl);
                            for (int index = parentResources.size() - 2; index >= 0; index--) {
                                PanResourceBean resource = parentResources.get(index);
                                JSONObject tmpObject = resourceToJSONObject(resource.getRid(), true);
                                tmpObject.put("children", lastJsonArray);
                                if (index == 0) {
                                    childrenJson.add(tmpObject);
                                } else {
                                    lastJsonArray = getChildrenJSONArray(parentResources.get(index - 1).getRid(),
                                            resource.getRid(), panAcl);
                                    lastJsonArray.add(tmpObject);
                                }
                            }
                        }
                    }
                    for (PanResourceBean child : childrenList) {
                        if (child.getRid().equals(ridToDeal)) {
                            // 
                            continue;
                        }
                        childrenJson.add(resourceToJSONObject(child.getRid(), false));
                    }

                    rootJsonObject.put("children", childrenJson);
                    rootJsonObject.put("state", "open");
                    attr.put("rel", "folder");

                }
            } catch (MeePoException e) {
                LOG.error("", e);
            }
            rootArray.add(rootJsonObject);
            JsonUtil.writeJSONObject(response, rootArray);
        } else {
            rid = decode(rid);
            JSONArray childrenJson = getChildrenJSONArray(rid, PanAclUtil.getInstance(request));
            JsonUtil.writeJSONObject(response, childrenJson);
        }
    }

    private List<PanResourceBean> getResourcePath(String originalRid) {
        List<PanResourceBean> result = new ArrayList<PanResourceBean>();
        int index = originalRid.lastIndexOf("/");
        if (index > 0) {
            String[] sp = originalRid.split("/");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < sp.length; i++) {
                if (i == 0) {
                    sb.append("/");
                    continue;
                }
                sb.append(sp[i]);
                PanResourceBean bean = new PanResourceBean();
                bean.setRid(encode(sb.toString()));
                bean.setTitle(sp[i]);
                result.add(bean);
                sb.append("/");
            }
        }
        return result;
    }

    private JSONArray getChildrenJSONArray(String rid, PanAcl panAcl) {
        JSONArray childrenJson = new JSONArray();
        MeePoMeta root;
        try {
            root = service.ls(panAcl, decode(rid), true);
            List<PanResourceBean> beans = getChildren(root, aoneUserService.getSimpleUserByUid(panAcl.getUid()));
            for (PanResourceBean child : beans) {
                childrenJson.add(resourceToJSONObject(child.getRid(), false));
            }
        } catch (MeePoException e) {
            LOG.error("", e);
        }
        return childrenJson;
    }

    private JSONArray getChildrenJSONArray(String rid, String ignoreRid, PanAcl panAcl) {
        JSONArray childrenJson = new JSONArray();
        MeePoMeta root;
        try {
            root = service.ls(panAcl, decode(rid), true);
            List<PanResourceBean> beans = getChildren(root, aoneUserService.getSimpleUserByUid(panAcl.getUid()));
            for (PanResourceBean child : beans) {
                if (child.getRid().equals(ignoreRid)) {
                    continue;
                }
                childrenJson.add(resourceToJSONObject(child.getRid(), false));
            }
        } catch (MeePoException e) {
            LOG.error("", e);
        }
        return childrenJson;
    }

    private JSONObject resourceToJSONObject(String rid, boolean open) {
        rid = decode(rid);
        JSONObject result = new JSONObject();
        int index = rid.lastIndexOf("/");
        String title = rid.substring(index + 1);
        result.put("data", title);
        JSONObject attr = new JSONObject();
        attr.put("rid", "node_" + encode(rid));
        attr.put("rel", "folder");
        result.put("attr", attr);
        if (open) {
            result.put("state", "open");
        } else {
            result.put("state", "closed");
        }
        return result;
    }

    private List<PanResourceBean> getChildren(MeePoMeta root, SimpleUser user) {
        List<PanResourceBean> result = new ArrayList<PanResourceBean>();
        if (root == null || root.contents == null) {
            return result;
        }
        MeePoMeta[] ms = root.contents;
        for (MeePoMeta m : ms) {
            result.add(MeePoMetaToPanBeanUtil.transfer(m, user));
        }
        filterFolder(result);
        PanResourceBeanSort.sort(result, PanResourceBeanSort.TYPE_TIME_DESC);
        return result;
    }

    private void filterFolder(List<PanResourceBean> beans) {
        Iterator<PanResourceBean> it = beans.iterator();
        while (it.hasNext()) {
            PanResourceBean bean = it.next();
            if (!LynxConstants.TYPE_FOLDER.equals(bean.getItemType())) {
                it.remove();
            }
        }
    }
}