/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.client.async;
import java.util.HashMap;
import java.util.Map;
import freenet.client.InsertContext;
import freenet.keys.FreenetURI;
import freenet.support.Logger;
import freenet.support.api.ManifestElement;
import freenet.support.io.ResumeFailedException;
/**
* <P>plain/dumb manifest putter: every file item is a redirect (no containers at all)
*
* <P>default doc:<BR>
* defaultName is just the name, without any '/'!<BR>
* each item <defaultName> is the default doc in the corresponding dir.
*/
public class PlainManifestPutter extends BaseManifestPutter {
private static final long serialVersionUID = 1L;
private static volatile boolean logDEBUG;
static {
Logger.registerClass(PlainManifestPutter.class);
}
public PlainManifestPutter(ClientPutCallback clientCallback, HashMap<String, Object> manifestElements, short prioClass, FreenetURI target, String defaultName, InsertContext ctx, boolean getCHKOnly,
boolean earlyEncode, boolean persistent, byte [] forceCryptoKey, ClientContext context) throws TooManyFilesInsertException {
super(clientCallback, manifestElements, prioClass, target, defaultName, ctx, ClientPutter.randomiseSplitfileKeys(target, ctx, persistent), forceCryptoKey, context);
}
@Override
protected void makePutHandlers(HashMap<String,Object> manifestElements, String defaultName) {
if(logDEBUG) Logger.debug(this, "Root map : "+manifestElements.size()+" elements");
makePutHandlers(getRootBuilder(), manifestElements, defaultName);
}
@SuppressWarnings("unchecked")
private void makePutHandlers(FreeFormBuilder builder, HashMap<String, Object> manifestElements, Object defaultName) {
for(Map.Entry<String, Object> entry:manifestElements.entrySet()) {
String name = entry.getKey();
Object o = entry.getValue();
if(o instanceof HashMap) {
HashMap<String,Object> subMap = (HashMap<String,Object>)o;
builder.pushCurrentDir();
builder.makeSubDirCD(name);
makePutHandlers(builder, subMap, defaultName);
builder.popCurrentDir();
if(logDEBUG) Logger.debug(this, "Sub map for "+name+" : "+subMap.size()+" elements");
} else {
ManifestElement element = (ManifestElement) o;
builder.addElement(name, element, name.equals(defaultName));
}
}
}
@Override
public void innerOnResume(ClientContext context) throws ResumeFailedException {
super.innerOnResume(context);
notifyClients(context);
}
}