/*******************************************************************************
* 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.cmis.factory.info;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.PostConstruct;
import jp.aegif.nemaki.model.NemakiPermissionDefinition;
import jp.aegif.nemaki.util.PropertyManager;
import jp.aegif.nemaki.util.YamlManager;
import jp.aegif.nemaki.util.constant.PropertyKey;
import org.apache.chemistry.opencmis.commons.data.PermissionMapping;
import org.apache.chemistry.opencmis.commons.definitions.PermissionDefinition;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.SupportedPermissions;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PermissionDefinitionDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PermissionMappingDataImpl;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class AclCapabilities extends org.apache.chemistry.opencmis.commons.impl.dataobjects.AclCapabilitiesDataImpl {
private static final long serialVersionUID = 8654484629504222836L;
private static final Log log = LogFactory.getLog(AclCapabilities.class);
private List<NemakiPermissionDefinition> nemakiPermissions;
private PropertyManager propertyManager;
@PostConstruct
public void init(){
nemakiPermissions = readPermissionDefinitions();
setSupportedPermissions(SupportedPermissions.BOTH);
setAclPropagation(AclPropagation.PROPAGATE);
setPermissionDefinitionData(buildPermissionDefinitions());
setPermissionMappingData(buildPermissionMaps());
}
// //////////////////////////////////////////////////////////////////////////
// Permission Definitions
// //////////////////////////////////////////////////////////////////////////
@SuppressWarnings("unchecked")
private List<NemakiPermissionDefinition> readPermissionDefinitions() {
List<NemakiPermissionDefinition> results = new ArrayList<NemakiPermissionDefinition>();
//Get definition file
String definitionFile = "";
try {
definitionFile = propertyManager.readValue(PropertyKey.PERMISSION_DEFINITION);
} catch (Exception e) {
log.error("Cannot read a permission definition file", e);
}
//Parse definition file
YamlManager manager = new YamlManager(definitionFile);
List<Map<String, Object>> yml = (List<Map<String, Object>>) manager
.loadYml();
for (Map<String, Object> y : yml) {
NemakiPermissionDefinition cp = new NemakiPermissionDefinition(y);
results.add(cp);
}
return results;
}
private List<PermissionDefinition> buildPermissionDefinitions() {
List<PermissionDefinition> permissions = new ArrayList<PermissionDefinition>();
for (NemakiPermissionDefinition np : nemakiPermissions) {
permissions.add(createPermission(np.getId(), np.getDescription()));
}
return permissions;
}
public HashMap<String, String> getBasicPermissionConversion (){
HashMap<String, String> result = new HashMap<String, String>();
for(NemakiPermissionDefinition np : nemakiPermissions){
result.put(np.getId(), np.getAsCmisBasicPermission());
}
return result;
}
private PermissionDefinition createPermission(String permission,
String description) {
PermissionDefinitionDataImpl pd = new PermissionDefinitionDataImpl();
pd.setId(permission);
pd.setDescription(description);
return pd;
}
// //////////////////////////////////////////////////////////////////////////
// Permission Mappings
// //////////////////////////////////////////////////////////////////////////
private LinkedHashMap<String, PermissionMapping> buildPermissionMaps() {
LinkedHashMap<String, PermissionMapping> table
= new LinkedHashMap<String, PermissionMapping>();
HashMap<String, ArrayList<String>> map = readPermissionMappingDefinitions();
//Build table
for(Entry<String, ArrayList<String>> entry : map.entrySet()){
//FIXME WORKAROUND: skip canCreatePolicy.Folder
if(PermissionMapping.CAN_CREATE_POLICY_FOLDER.equals(entry.getKey())){
continue;
}
PermissionMappingDataImpl mapping = new PermissionMappingDataImpl();
mapping.setKey(entry.getKey());
mapping.setPermissions(entry.getValue());
table.put(mapping.getKey(), mapping);
}
//Add customized permissions to table
for(NemakiPermissionDefinition custom : nemakiPermissions){
customizeTable(custom, table);
}
return table;
}
private void customizeTable(NemakiPermissionDefinition custom, LinkedHashMap<String, PermissionMapping> table){
for(Entry<String, PermissionMapping> entry : table.entrySet()){
String k = entry.getKey();
PermissionMapping pm = entry.getValue();
//Add where base exists
if(CollectionUtils.isNotEmpty(custom.getBase())){
//Check if any base is contained
boolean baseContained = false;
for(String base : custom.getBase()){
if(pm.getPermissions().contains(base)){
baseContained = true;
break;
}
}
//Check mapped flag
Boolean mapped = custom.getPermissionMapping().get(k);
//Default to true
if(custom.getPermissionMapping().containsKey(k) && mapped == null){
mapped = true;
}
//Customize table
if(Boolean.TRUE == mapped || ((mapped == null) && baseContained)){
//Add without duplicate
boolean duplicate = pm.getPermissions().contains(custom.getId());
if(!duplicate){
List<String> permissions = new ArrayList<String>(pm.getPermissions());
permissions.add(custom.getId());
PermissionMappingDataImpl pmdi = new PermissionMappingDataImpl();
pmdi.setKey(k);
pmdi.setPermissions(permissions);
table.put(k, pmdi);
}
}
}
}
}
@SuppressWarnings("unchecked")
private HashMap<String, ArrayList<String>> readPermissionMappingDefinitions(){
//Decide base definition file
String definitionFile = "";
try {
definitionFile = propertyManager.readValue(PropertyKey.PERMISSION_MAPPING_DEFINITION);
} catch (Exception e) {
log.error("Cannot read a permission mapping definition file", e);
}
//Get mapping info
YamlManager ymgr = new YamlManager(definitionFile);
Object yaml = ymgr.loadYml();
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
try{
map = (HashMap<String, ArrayList<String>>) yaml;
}catch(Exception e){
log.error(definitionFile + " is not well-formatted.", e);
}
return map;
}
public void setPropertyManager(PropertyManager propertyManager) {
this.propertyManager = propertyManager;
}
}