com.jeans.iservlet.service.fts.impl.FtsServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.jeans.iservlet.service.fts.impl.FtsServiceImpl.java

Source

package com.jeans.iservlet.service.fts.impl;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jeans.iservlet.dao.BaseDao;
import com.jeans.iservlet.dao.FtsDao;
import com.jeans.iservlet.enums.it.SystemScope;
import com.jeans.iservlet.model.asset.Asset;
import com.jeans.iservlet.model.asset.Hardware;
import com.jeans.iservlet.model.asset.Software;
import com.jeans.iservlet.model.cloud.CloudFile;
import com.jeans.iservlet.model.cloud.CloudList;
import com.jeans.iservlet.model.cloud.CloudUnit;
import com.jeans.iservlet.model.hr.Company;
import com.jeans.iservlet.model.it.ITSystem;
import com.jeans.iservlet.model.it.Project;
import com.jeans.iservlet.model.it.SystemBranch;
import com.jeans.iservlet.model.it.post.Page;
import com.jeans.iservlet.model.it.post.Post;
import com.jeans.iservlet.model.portal.User;
import com.jeans.iservlet.service.fts.FtsService;
import com.jeans.iservlet.utils.LoggerUtils;
import com.jeans.iservlet.view.portal.FtsResultView;

@Service
public class FtsServiceImpl implements FtsService {
    /**
     * 
     */
    protected static final int FTS_ASSET_HARDWARE = 201;
    protected static final int FTS_ASSET_SOFTWARE = 202;
    protected static final int FTS_IT_SYSTEM = 301;
    protected static final int FTS_IT_WIKI = 302;
    protected static final int FTS_PROJECT = 401;
    protected static final int FTS_CLOUD_FILE = 601;
    protected static final int FTS_CLOUD_LIST = 602;

    @Autowired
    private FtsDao<Hardware> hardwareDao;
    @Autowired
    private FtsDao<Software> softwareDao;
    @Autowired
    private FtsDao<ITSystem> systemDao;
    @Autowired
    private FtsDao<Post> postDao;
    @Autowired
    private FtsDao<CloudFile> fileDao;
    @Autowired
    private FtsDao<CloudList> listDao;
    @Autowired
    private FtsDao<Project> prjDao;

    @Autowired
    private BaseDao<Page> pageDao;

    @Override
    public void reIndex() throws InterruptedException {
        fileDao.reIndex();
    }

    @Override
    public Map<String, List<FtsResultView>> search(String catalog, String keyword, User user) {
        Map<String, List<FtsResultView>> results = new LinkedHashMap<String, List<FtsResultView>>();
        if (StringUtils.contains(catalog, "S")) {
            // TODO ???
        }
        if (StringUtils.contains(catalog, "A")) {
            // ??
            List<Asset> assets = assetSearch(keyword, user.getCompany().getId());
            if (null != assets && assets.size() > 0) {
                // ?
                List<FtsResultView> items = new ArrayList<FtsResultView>();
                for (Asset asset : assets) {
                    FtsResultView item = new FtsResultView();
                    item.setId(asset.getId());
                    item.setTitle(asset.getFullName());
                    if (asset instanceof Hardware) {
                        item.setType(FTS_ASSET_HARDWARE);
                    } else {
                        item.setType(FTS_ASSET_SOFTWARE);
                    }
                    items.add(item);
                }
                results.put("?", items);
            }
        }
        if (StringUtils.contains(catalog, "W")) {
            // ???ITSystem, Post
            List<FtsResultView> items = new ArrayList<FtsResultView>();
            List<ITSystem> systems = systemSearch(keyword);
            Company company = user.getCompany();
            for (ITSystem system : systems) {
                if (system.getOwner().equals(company)) {
                    items.add(wrapSystem(system));
                    continue;
                }
                boolean branched = false;
                Set<SystemBranch> branches = system.getBranches();
                for (SystemBranch branch : branches) {
                    if (branch.getCompany().equals(company)) {
                        branched = true;
                        items.add(wrapSystem(system));
                        break;
                    }
                }
                if (branched) {
                    continue;
                }
                if (system.getScope() == SystemScope.Custom) {
                    if (system.getCompaniesInScope().contains(company)) {
                        items.add(wrapSystem(system));
                        continue;
                    }
                } else {
                    if (company.getLevel() != Company.PROVINCE) {
                        if (system.getOwner().equals(company.getSuperior())
                                && system.getScope() != SystemScope.Private) {
                            items.add(wrapSystem(system));
                            continue;
                        }
                        if (company.getLevel() == Company.BRANCH
                                && system.getOwner().equals(company.getSuperior().getSuperior())
                                && (system.getScope() == SystemScope.PrivateAndInferiors
                                        || system.getScope() == SystemScope.Inferiors)) {
                            items.add(wrapSystem(system));
                            continue;
                        }
                    }
                }
            }
            List<Post> posts = wikiSearch(keyword);
            Set<Page> pages = new HashSet<Page>();
            for (Post post : posts) {
                if (null == post.getPage()) {
                    Page p = pageDao.getById(Page.class, post.getId());
                    if (p.getWiki().getCompanies().contains(company) || (company.getLevel() == Company.BRANCH
                            && p.getWiki().getCompanies().contains(company.getSuperior()))) {
                        System.out.println("id=" + p.getId());
                        pages.add(p);
                    }
                } else {
                    if (post.getPage().getWiki().getCompanies().contains(company)
                            || (company.getLevel() == Company.BRANCH
                                    && post.getPage().getWiki().getCompanies().contains(company.getSuperior()))) {
                        pages.add(post.getPage());
                    }
                }
            }
            for (Page page : pages) {
                items.add(wrapPage(page));
            }
            if (!items.isEmpty()) {
                results.put("?", items);
            }
        }
        if (StringUtils.contains(catalog, "P")) {
            // ??
            List<Project> projects = projectSearch(keyword);
            if (null != projects && projects.size() > 0) {
                List<FtsResultView> items = new ArrayList<FtsResultView>();
                for (Project project : projects) {
                    if (project.getProjectTeam().getStaff().contains(user.getEmployee())) {
                        FtsResultView item = new FtsResultView();
                        item.setId(project.getId());
                        item.setTitle(project.getName());
                        item.setType(FTS_PROJECT);
                        items.add(item);
                    }
                }
                results.put("", items);
            }
        }
        if (StringUtils.contains(catalog, "M")) {
            // TODO ???
        }
        if (StringUtils.contains(catalog, "D")) {
            // ??
            List<CloudUnit> units = cloudSearch(keyword);
            if (null != units && units.size() > 0) {
                List<FtsResultView> items = new ArrayList<FtsResultView>();
                for (CloudUnit unit : units) {
                    // ?
                    FtsResultView item = new FtsResultView();
                    item.setId(unit.getId());
                    if (unit instanceof CloudFile) {
                        item.setTitle(unit.getOwner().getName() + " - " + ((CloudFile) unit).getVersionFilename());
                        item.setType(FTS_CLOUD_FILE);
                    } else {
                        item.setTitle(unit.getOwner().getName() + " - " + unit.getName());
                        item.setType(FTS_CLOUD_LIST);
                    }
                    items.add(item);
                }
                results.put("", items);
            }
        }
        return results;
    }

    /**
     * ?HardwareSoftware
     * 
     * @param keyword
     * @param companyId
     * @return
     */
    private List<Asset> assetSearch(String keyword, long companyId) {
        String kw = keyword.trim().replaceAll("\\s+", " ");
        List<Asset> assets = new ArrayList<Asset>();
        try {
            assets.addAll(hardwareDao.query(Hardware.class, new String[] { "fullName", "comment", "location" },
                    new String[] { "sn", "ip", "code", "financialCode" }, kw, "companyId", companyId));
            assets.addAll(softwareDao.query(Software.class, new String[] { "fullName", "comment" },
                    new String[] { "license" }, kw, "companyId", companyId));
        } catch (Exception e) {
            LoggerUtils.error(e);
        }
        return assets;
    }

    /**
     * ??
     * 
     * @param keyword
     * @param companyId
     * @return
     */
    private List<ITSystem> systemSearch(String keyword) {
        List<ITSystem> systems = new ArrayList<ITSystem>();
        String kw = keyword.trim().replaceAll("\\s+", " ");
        try {
            systems.addAll(systemDao.query(ITSystem.class, new String[] { "name", "alias", "modelOrVersion",
                    "brief", "provider.alias", "provider.englishName", "provider.name" }, kw));
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtils.error(e);
        }
        return systems;
    }

    private FtsResultView wrapSystem(ITSystem system) {
        FtsResultView item = new FtsResultView();
        item.setId(system.getId());
        item.setType(FTS_IT_SYSTEM);
        if (StringUtils.isBlank(system.getModelOrVersion())) {
            item.setTitle(system.getName());
        } else {
            item.setTitle(system.getName() + " - " + system.getModelOrVersion());
        }
        return item;
    }

    /**
     * ??
     * 
     * @param keyword
     * @param companyId
     * @return
     */
    private List<Post> wikiSearch(String keyword) {
        List<Post> posts = new ArrayList<Post>();
        String kw = keyword.trim().replaceAll("\\s+", " ");
        try {
            posts.addAll(postDao.query(Post.class, new String[] { "title", "text" }, kw));
        } catch (Exception e) {
            LoggerUtils.error(e);
        }
        return posts;
    }

    private FtsResultView wrapPage(Page page) {
        FtsResultView item = new FtsResultView();
        item.setId(page.getId());
        item.setType(FTS_IT_WIKI);
        StringBuilder builder = new StringBuilder("");
        builder.append(page.getTitle()).append("?");
        String[] lines = page.getText().split("\n");
        int i = 0;
        for (i = 0; i < lines.length; i++) {
            if (!StringUtils.isBlank(lines[i])) {
                break;
            }
        }
        if (i == lines.length) {
            builder.append("");
        } else {
            builder.append(lines[i].length() <= 75 ? lines[i] : lines[i].substring(0, 75) + "...");
        }
        item.setTitle(builder.toString());
        return item;
    }

    /**
     * ?Project
     * 
     * @param keyword
     * @return
     */
    private List<Project> projectSearch(String keyword) {
        String kw = keyword.trim().replaceAll("\\s+", " ");
        List<Project> projects = new ArrayList<Project>();
        try {
            projects.addAll(prjDao.query(Project.class,
                    new String[] { "name", "constructor.name", "constructor.alias", "constructor.englishName" },
                    kw));
        } catch (Exception e) {
            LoggerUtils.error(e);
        }
        return projects;
    }

    /**
     * ?CloudFileCloudList
     * 
     * @param keyword
     * @return
     */
    private List<CloudUnit> cloudSearch(String keyword) {
        String kw = keyword.trim().replaceAll("\\s+", " ");
        List<CloudUnit> units = new ArrayList<CloudUnit>();
        try {
            units.addAll(fileDao.query(CloudFile.class, new String[] { "versionFilename", "tags.title" }, kw));
            units.addAll(listDao.query(CloudList.class, new String[] { "name", "tags.title" }, kw));
        } catch (Exception e) {
            LoggerUtils.error(e);
        }
        return units;
    }
}