package fi.otavanopisto.muikku.plugins.dnm.util; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Element; import fi.otavanopisto.muikku.plugins.material.BinaryMaterialController; import fi.otavanopisto.muikku.plugins.material.model.BinaryMaterial; import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialController; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial; public class TaskBase64Image extends AbstractHtmlMaterialCleanerTask { @Inject private Logger logger; @Inject private BinaryMaterialController binaryMaterialController; @Inject private WorkspaceMaterialController workspaceMaterialController; private int imageCounter = 0; @Override protected void cleanElement(Element element) { if ("img".equals(element.getTagName())) { String src = element.getAttribute("src"); if (StringUtils.startsWith(src, "data:") && StringUtils.contains(src, ";base64,")) { logger.info("Converting base64 image"); try { String contentType = StringUtils.substringBetween(src, "data:", ";base64,"); byte[] data = Base64.decodeBase64(StringUtils.substringAfter(src, ";base64,")); String prefix = null; if (StringUtils.contains(contentType, "jpg") || StringUtils.contains(contentType, "jpeg")) { prefix = "jpg"; } else if (StringUtils.contains(contentType, "gif")) { prefix = "gif"; } else if (StringUtils.contains(contentType, "png")) { prefix = "png"; } else { logger.log(Level.WARNING, String.format("Image of content type %s prefixed as %s", contentType, prefix)); } String name = prefix == null ? String.format("img%s", StringUtils.leftPad(++imageCounter + "", 3, '0')) : String.format("img%s.%s", StringUtils.leftPad(++imageCounter + "", 3, '0'), prefix); String license = null; BinaryMaterial material = binaryMaterialController.createBinaryMaterial(name, contentType, data, license); WorkspaceMaterial workspaceMaterial = workspaceMaterialController.createWorkspaceMaterial(getWorkspaceMaterial(), material); String workspaceUrl = StringUtils.prependIfMissing(workspaceMaterialController.getCompletePath(workspaceMaterial), "/"); logger.info(String.format("Image converted to %s", workspaceUrl)); element.setAttribute("src", workspaceUrl); markModified(); } catch (Exception e) { logger.log(Level.SEVERE, String.format("Failed to fix image from %s", src), e); } } } } @Override public Integer getPriority() { return PRIORITY_HIGH; } }