All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dw.xmlrpc.Attacher Maven / Gradle / Ivy

package dw.xmlrpc;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.timroes.base64.Base64;
import dw.xmlrpc.exception.DokuException;

//! @cond
class Attacher {
	private final CoreClient _client;

	public Attacher(CoreClient client){
		_client = client;
	}

	byte[] serializeFile(File f) throws IOException{
		byte[] b = new byte[(int)f.length()];
		FileInputStream fileInputStream = new FileInputStream(f);
		fileInputStream.read(b);
		fileInputStream.close();
		return b;
	}

	void deserializeFile(byte[] b, File f) throws IOException{
		FileOutputStream fileOutputStream = new FileOutputStream(f);
		fileOutputStream.write(b);
		fileOutputStream.close();
	}

	public void putAttachment(String fileId, byte[] file, boolean overwrite) throws DokuException{
		Map additionalParam = new HashMap();
		additionalParam.put("ow", overwrite);

		Object[] params = new Object[]{
				fileId,
				file,
				additionalParam
		};

		_client.genericQuery("wiki.putAttachment", params);
	}

	public List getRecentMediaChanges(Integer timestamp) throws DokuException{
		Object result = _client.genericQuery("wiki.getRecentMediaChanges", timestamp);
		List res = new ArrayList();

		for(Object o : (Object[]) result){
			@SuppressWarnings("unchecked")
			Map map = (Map) o;

			String id = (String) map.get("name");
			Date lastModified = (Date) map.get("lastModified");
			String author = (String) map.get("author");
			Integer version = (Integer) map.get("version");
			Integer perms = (Integer) map.get("perms");
			Object sizeObj = map.get("size");
			Integer size = null;
			if ( sizeObj instanceof Integer ){
				size = (Integer) sizeObj;
			}

			res.add(new MediaChange(id, lastModified, author, version, perms, size));
		}

		return res;
	}

	public List getAttachments(String namespace, Map additionalParams) throws DokuException{
		if ( additionalParams == null ){
			additionalParams = new HashMap();
		}
		Object[] params = new Object[]{namespace, additionalParams};
		Object result = _client.genericQuery("wiki.getAttachments", params);
		List res = new ArrayList();
		for(Object o : (Object[]) result){
			res.add(buildAttachmentDetailsFromResult(o));
		}

		return res;
	}

	@SuppressWarnings("unchecked")
	private AttachmentDetails buildAttachmentDetailsFromResult(Object o){
		return buildAttachmentDetailsFromResult((Map) o);
	}

	private AttachmentDetails buildAttachmentDetailsFromResult(Map m){
		String id = (String) m.get("id");
		Integer size = (Integer) m.get("size");
		Date lastModified = (Date) m.get("lastModified");
		Boolean isImg = (Boolean) m.get("isimg");
		Boolean writable = (Boolean) m.get("writable");
		String file = (String) m.get("file");
		Integer mtime = (Integer) m.get("mtime");
		Integer perms = (Integer) m.get("perm");
		if ( perms == null ){
			//Because it has been renamed in API v8
			perms = (Integer) m.get("perms");
		}
		return new AttachmentDetails(id, size, lastModified, isImg, writable, perms, file, mtime);
	}

	public AttachmentInfo getAttachmentInfo(String fileId) throws DokuException{
		Object result = _client.genericQuery("wiki.getAttachmentInfo", fileId);
		return buildAttachmentInfoFromResult(result, fileId);
	}

	@SuppressWarnings("unchecked")
	private AttachmentInfo buildAttachmentInfoFromResult(Object o, String fileId){
		return buildAttachmentInfoFromResult((Map) o, fileId);
	}

	private AttachmentInfo buildAttachmentInfoFromResult(Map m, String fileId){
		Integer size = (Integer) m.get("size");
		Date lastModified = null;
		try {
			lastModified = (Date) m.get("lastModified");
		} catch (ClassCastException e){
			//for DW up to 2012-01-25b: when the file doesn't exist,
			//"lastModified" is int 0
			lastModified = defaultDate();
		}
		return new AttachmentInfo(fileId, size, lastModified);
	}

	private Date defaultDate(){
		Calendar calendar = Calendar.getInstance();
		calendar.set(1970, 0, 0);
		return calendar.getTime();
	}

	public void deleteAttachment(String fileId) throws DokuException{
		_client.genericQuery("wiki.deleteAttachment", fileId);
	}

	public byte[] getAttachment(String fileId) throws DokuException{
		Object result = _client.genericQuery("wiki.getAttachment", fileId);
		try {
			return (byte[]) result;
		} catch (ClassCastException e){
			//for DW up to 2012-01-25b
			String base64Encoded = (String) result;
			return Base64.decode(base64Encoded);
		}
	}
//! @endcond
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy