/* * Copyright 2011 Future Systems, Inc. * * 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 org.krakenapps.dom.api.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Provides; import org.apache.felix.ipojo.annotations.Requires; import org.krakenapps.confdb.Predicate; import org.krakenapps.confdb.Predicates; import org.krakenapps.dom.api.ConfigManager; import org.krakenapps.dom.api.DefaultEntityEventProvider; import org.krakenapps.dom.api.OrganizationUnitApi; import org.krakenapps.dom.model.OrganizationUnit; @Component(name = "dom-org-unit-api") @Provides public class OrganizationUnitApiImpl extends DefaultEntityEventProvider<OrganizationUnit> implements OrganizationUnitApi { private static final Class<OrganizationUnit> cls = OrganizationUnit.class; private static final String NOT_FOUND = "org-unit-not-found"; private static final String ALREADY_EXIST = "org-unit-already-exist"; @Requires private ConfigManager cfg; private Predicate getPred(String guid) { return Predicates.field("guid", guid); } private List<Predicate> getPreds(List<OrganizationUnit> orgUnits) { if (orgUnits == null) return new ArrayList<Predicate>(); List<Predicate> preds = new ArrayList<Predicate>(orgUnits.size()); for (OrganizationUnit orgUnit : orgUnits) preds.add(getPred(orgUnit.getGuid())); return preds; } @Override public Collection<OrganizationUnit> getOrganizationUnits(String domain) { return getOrganizationUnits(domain, true); } @Override public Collection<OrganizationUnit> getOrganizationUnits(String domain, boolean includeChildren) { Collection<OrganizationUnit> orgUnits = cfg.all(domain, cls); if (!includeChildren) return orgUnits; for (OrganizationUnit orgUnit : orgUnits) orgUnit.setChildren(getChildrens(domain, orgUnit.getGuid())); return orgUnits; } @Override public OrganizationUnit findOrganizationUnit(String domain, String guid) { OrganizationUnit orgUnit = cfg.find(domain, cls, getPred(guid)); if (orgUnit == null) return null; orgUnit.setChildren(getChildrens(domain, orgUnit.getGuid())); return orgUnit; } @Override public OrganizationUnit getOrganizationUnit(String domain, String guid) { OrganizationUnit orgUnit = cfg.get(domain, cls, getPred(guid), NOT_FOUND); orgUnit.setChildren(getChildrens(domain, orgUnit.getGuid())); return orgUnit; } @Override public OrganizationUnit findOrganizationUnitByName(String domain, String... names) { OrganizationUnit orgUnit = null; String parentGuid = null; for (String name : names) { Map<String, Object> terms = new HashMap<String, Object>(); terms.put("name", name); terms.put("parent", parentGuid); orgUnit = cfg.find(domain, OrganizationUnit.class, Predicates.field(terms)); if (orgUnit == null) return null; parentGuid = orgUnit.getGuid(); } orgUnit.setChildren(getChildrens(domain, orgUnit.getGuid())); return orgUnit; } private List<OrganizationUnit> getChildrens(String domain, String guid) { Collection<OrganizationUnit> orgUnits = cfg.all(domain, cls, Predicates.field("parent", guid)); for (OrganizationUnit orgUnit : orgUnits) orgUnit.setChildren(getChildrens(domain, orgUnit.getGuid())); return (List<OrganizationUnit>) orgUnits; } @Override public void createOrganizationUnits(String domain, Collection<OrganizationUnit> orgUnits) { List<OrganizationUnit> orgUnitList = new ArrayList<OrganizationUnit>(orgUnits); cfg.adds(domain, cls, getPreds(orgUnitList), orgUnitList, ALREADY_EXIST, this); } @Override public void createOrganizationUnit(String domain, OrganizationUnit orgUnit) { cfg.add(domain, cls, getPred(orgUnit.getGuid()), orgUnit, ALREADY_EXIST, this); } @Override public void updateOrganizationUnits(String domain, Collection<OrganizationUnit> orgUnits) { List<OrganizationUnit> orgUnitList = new ArrayList<OrganizationUnit>(orgUnits); for (OrganizationUnit orgUnit : orgUnitList) orgUnit.setUpdated(new Date()); cfg.updates(domain, cls, getPreds(orgUnitList), orgUnitList, NOT_FOUND, this); } @Override public void updateOrganizationUnit(String domain, OrganizationUnit orgUnit) { orgUnit.setUpdated(new Date()); cfg.update(domain, cls, getPred(orgUnit.getGuid()), orgUnit, NOT_FOUND, this); } @Override public void removeOrganizationUnits(String domain, Collection<String> guids) { removeOrganizationUnits(domain, guids, false); } @Override public void removeOrganizationUnits(String domain, Collection<String> guids, boolean moveUser) { Set<String> orgUnitGuids = new HashSet<String>(); List<Predicate> preds = new ArrayList<Predicate>(); for (String guid : guids) { if (orgUnitGuids.contains(guid)) continue; List<OrganizationUnit> orgUnits = getOrganizationUnitTree(getOrganizationUnit(domain, guid)); for (OrganizationUnit orgUnit : orgUnits) orgUnitGuids.add(orgUnit.getGuid()); preds.addAll(getPreds(orgUnits)); } cfg.removes(domain, cls, preds, NOT_FOUND, this, moveUser, null); } @Override public void removeOrganizationUnit(String domain, String guid) { removeOrganizationUnit(domain, guid, false); } @Override public void removeOrganizationUnit(String domain, String guid, boolean moveUser) { List<OrganizationUnit> orgUnits = getOrganizationUnitTree(getOrganizationUnit(domain, guid)); cfg.removes(domain, cls, getPreds(orgUnits), NOT_FOUND, this, moveUser, null); } private List<OrganizationUnit> getOrganizationUnitTree(OrganizationUnit orgUnit) { List<OrganizationUnit> orgUnits = new ArrayList<OrganizationUnit>(); for (OrganizationUnit child : orgUnit.getChildren()) orgUnits.addAll(getOrganizationUnitTree(child)); orgUnits.add(orgUnit); return orgUnits; } }