/*******************************************************************************
* Copyright (c) 2013 aegif.
*
* This file is part of NemakiWare.
*
* NemakiWare is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NemakiWare is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with NemakiWare.
* If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* linzhixing(https://github.com/linzhixing) - initial API and implementation
******************************************************************************/
package jp.aegif.nemaki.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
//This class need to be calculated for the path of inherited ACEs
public class Acl {
private List<Ace> inheritedAces;
private List<Ace> localAces;
public Acl(){
inheritedAces = new ArrayList<Ace>();
localAces = new ArrayList<Ace>();
}
public List<Ace> getInheritedAces() {
return inheritedAces;
}
public void setInheritedAces(List<Ace> inheritedAces) {
this.inheritedAces = inheritedAces;
}
public List<Ace> getLocalAces() {
return localAces;
}
public void setLocalAces(List<Ace> localAces) {
this.localAces = localAces;
}
public List<Ace> getAllAces(){
//TODO local overwrites inherited
List<Ace> merged = new ArrayList<Ace>(inheritedAces);
merged.addAll(localAces);
return merged;
}
public List<Ace>getPropagatingAces(){
List<Ace> merged = new ArrayList<Ace>(inheritedAces);
//merged.add(ace);
return merged;
}
public List<Ace> getMergedAces(){
HashMap<String, Ace> _result = buildMap(localAces);
HashMap<String, Ace> localMap = buildMap(localAces);
HashMap<String, Ace> inheritedMap = buildMap(inheritedAces);
for(Entry<String, Ace> i : inheritedMap.entrySet()){
if(!localMap.containsKey(i.getKey())){
_result.put(i.getKey(), i.getValue());
}
}
//Convert map to list
List<Ace> result = new ArrayList<Ace>();
for(Entry<String, Ace> r : _result.entrySet()){
result.add(r.getValue());
}
return result;
}
public void mergeInheritedAces(Acl acl){
//Inheritすべき外部からのインプットを確定する
List<Ace> aces = acl.getMergedAces();
HashMap<String, Ace> localMap = buildMap(localAces);
HashMap<String, Ace> inheritedMap = buildMap(aces);
for(Entry<String, Ace> i : inheritedMap.entrySet()){
if(!localMap.containsKey(i.getKey())){
this.inheritedAces.add(i.getValue());
}
}
}
private HashMap<String, Ace> buildMap(List<Ace> aces){
HashMap<String, Ace> map = new HashMap<String, Ace>();
for(Ace ace : aces){
map.put(ace.getPrincipalId(), ace);
}
return map;
}
}