All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ars.module.people.service.AbstractUserService Maven / Gradle / Ivy

package ars.module.people.service;

import java.util.Map;
import java.util.Set;
import java.util.List;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.ArrayList;
import java.util.LinkedList;
import java.io.Serializable;

import ars.util.Beans;
import ars.util.Nfile;
import ars.util.SimpleTree;
import ars.file.Operator;
import ars.file.DiskOperator;
import ars.file.RandomNameGenerator;
import ars.file.DateDirectoryGenerator;
import ars.invoke.request.Requester;
import ars.invoke.request.AccessDeniedException;
import ars.invoke.request.RequestHandleException;
import ars.invoke.request.ParameterInvalidException;
import ars.module.people.model.Role;
import ars.module.people.model.User;
import ars.module.people.model.Group;
import ars.module.people.assist.Passwords;
import ars.module.people.service.UserService;
import ars.database.repository.Repositories;
import ars.database.service.StandardGeneralService;

/**
 * 用户业务操作抽象实现
 * 
 * @author yongqiangwu
 * 
 * @param 
 *            数据模型
 */
public abstract class AbstractUserService extends StandardGeneralService implements UserService {
	private String staticDirectory; // 用户静态资源目录
	private Operator staticOperator;

	public String getStaticDirectory() {
		return staticDirectory;
	}

	public void setStaticDirectory(String staticDirectory) {
		this.staticDirectory = staticDirectory;
		DiskOperator operator = new DiskOperator(staticDirectory);
		operator.setNameGenerator(new RandomNameGenerator());
		operator.setDirectoryGenerator(new DateDirectoryGenerator());
		this.staticOperator = operator;
	}

	public Operator getStaticOperator() {
		return staticOperator;
	}

	public void setStaticOperator(Operator staticOperator) {
		this.staticOperator = staticOperator;
	}

	@Override
	public void initObject(Requester requester, T entity, Map parameters) {
		super.initObject(requester, entity, parameters);
		Group group = entity.getGroup();
		if (group == null) {
			throw new AccessDeniedException("Illegal operation");
		}
		User owner = this.getRepository().query().eq("code", requester.getUser()).single();
		if (!owner.getAdmin() && !group.getKey().startsWith(owner.getGroup().getKey())) {
			throw new AccessDeniedException("Illegal operation");
		}
	}

	@Override
	public Serializable saveObject(Requester requester, T object) {
		if (object.getPassword() == null) {
			object.setPassword(Passwords.encode("123456"));
		} else {
			object.setPassword(Passwords.encode(object.getPassword()));
		}
		return super.saveObject(requester, object);
	}

	@Override
	public void deleteObject(Requester requester, T object) {
		User owner = this.getRepository().query().eq("code", requester.getUser()).single();
		if (!owner.getAdmin() && !object.getGroup().getKey().startsWith(owner.getGroup().getKey())) {
			throw new RequestHandleException("Unauthorized operation");
		}
		super.deleteObject(requester, object);
	}

	@Override
	public List trees(Requester requester, Integer[] groups, Integer level,
			Map parameters) {
		boolean grouped = groups != null && groups.length > 0;
		List departments = grouped
				? Repositories.getRepository(Group.class).query().ge("level", level).in("id", groups).asc("order")
						.list()
				: new LinkedList();
		List objects = grouped ? this.getQuery(requester, parameters).in("group.id", groups).list()
				: this.getQuery(requester, parameters).list();
		if (!grouped && objects.isEmpty()) {
			return new ArrayList(0);
		}
		Map> leaves = new HashMap>();
		for (int i = 0; i < objects.size(); i++) {
			User user = objects.get(i);
			Group group = user.getGroup();
			List users = leaves.get(group);
			if (users == null) {
				users = new LinkedList();
				leaves.put(group, users);
			}
			users.add(Repositories.getSimpleTree(user));
			while (!grouped && group != null && (level == null || group.getLevel() >= level)
					&& !departments.contains(group)) {
				departments.add(group);
				group = group.getParent();
			}
		}
		Map mappings = new HashMap(departments.size());
		List trunks = Repositories.getSimpleTrees(Repositories.mergeTrees(departments), mappings);
		for (Entry> entry : leaves.entrySet()) {
			SimpleTree leaf = mappings.get(entry.getKey());
			List children = entry.getValue();
			leaf.getChildren().addAll(0, children);
			for (SimpleTree child : children) {
				child.setParent(leaf);
			}
		}
		return trunks;
	}

	@Override
	public void empower(Requester requester, Integer[] users, Integer[] roles, Boolean cover,
			Map parameters) {
		List persons = this.getQuery(requester).in("id", users).list();
		Set powers = new HashSet(Repositories.getRepository(Role.class).query().in("id", roles).list());
		if (persons.isEmpty() || powers.isEmpty()) {
			return;
		}
		for (int i = 0; i < persons.size(); i++) {
			T person = persons.get(i);
			if (cover && !Beans.isEqual(powers, person.getRoles())) {
				person.setRoles(powers);
				updateObject(requester, person);
			} else if (!cover) {
				Set temp = new HashSet(person.getRoles());
				person.getRoles().addAll(powers);
				if (!Beans.isEqual(temp, person.getRoles())) {
					updateObject(requester, person);
				}
			}
		}
	}

	@Override
	public void password(Requester requester, Integer id, String code, String name, String password,
			Map parameters) {
		T user = this.getRepository().get(id);
		if (user == null || !code.equals(user.getCode()) || !name.equals(user.getName())) {
			throw new ParameterInvalidException("user", "invalid");
		} else if (password.length() < 6) {
			throw new ParameterInvalidException("password", "invalid");
		}
		user.setPassword(Passwords.encode(password));
		this.getRepository().update(user);
	}

	@Override
	public String upload(Requester requester, String path, Nfile file, Map parameters)
			throws Exception {
		if (this.staticOperator == null) {
			throw new RuntimeException("Static operator has not been initialize");
		}
		return this.staticOperator.write(file, path);
	}

	@Override
	public Nfile download(Requester requester, String path, Map parameters) throws Exception {
		if (this.staticOperator == null) {
			throw new RuntimeException("Static operator has not been initialize");
		}
		return this.staticOperator.read(path);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy