package dw.xmlrpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import dw.xmlrpc.exception.DokuException;
//! @cond
class Locker {
private final CoreClient _client;
public Locker(CoreClient client){
_client = client;
}
public LockResult lock(String pageId) throws DokuException{
List<String> pageIds = new ArrayList<String>();
pageIds.add(pageId);
return setLocks(pageIds, null);
}
public LockResult unlock(String pageId) throws DokuException{
List<String> pageIds = new ArrayList<String>();
pageIds.add(pageId);
return setLocks(null, pageIds);
}
@SuppressWarnings("unchecked")
public LockResult setLocks(List<String> pagesToLock, List<String> pagesToUnlock) throws DokuException{
Map<String, Object> params = BuildParams(pagesToLock, pagesToUnlock);
Object result = _client.genericQuery("dokuwiki.setLocks", params);
return BuildLockResult((Map<String, Object>) result);
}
private Map<String, Object> BuildParams(List<String> pagesToLock, List<String> pagesToUnlock){
Map<String, Object> params = new HashMap<String, Object>();
params.put("lock", pagesToLock == null ? new Object[]{} : pagesToLock.toArray());
params.put("unlock", pagesToUnlock == null ? new Object[]{} : pagesToUnlock.toArray());
return params;
}
private LockResult BuildLockResult(Map<String, Object> data){
Object lockedObj = data.get("locked");
Object lockfailObj = data.get("lockfail");
Object unlockedObj = data.get("unlocked");
Object unlockfailObj = data.get("unlockfail");
return new LockResult(objToStr(lockedObj),
objToStr(lockfailObj),
objToStr(unlockedObj),
objToStr(unlockfailObj));
}
private Set<String> objToStr(Object objects){
return objToStr((Object[]) objects);
}
private Set<String> objToStr(Object[] objects){
Set<String> result = new HashSet<String>();
if ( objects == null ){
return result;
}
for(Object o : objects){
result.add((String) o);
}
return result;
}
//! @endcond
}