package fi.otavanopisto.muikku.plugins.dnm.util; import java.io.InputStream; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; import org.apache.commons.io.IOUtils; 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 TaskMathMl extends AbstractHtmlMaterialCleanerTask { @Inject private Logger logger; @Inject private BinaryMaterialController binaryMaterialController; @Inject private WorkspaceMaterialController workspaceMaterialController; private int imageCounter = 0; @Override protected void cleanElement(Element element) { boolean needsModify = false; if ("img".equals(element.getTagName()) && element.hasAttribute("ix_mathmldata")) { String src = element.getAttribute("src"); if (StringUtils.startsWith(src, "/~Repository/ResourceAPI/RenderMathML")) { src = "http://muikku.otavanopisto.fi" + src; needsModify = true; } else if (StringUtils.startsWith(src, "muikku.otavanopisto.fi/~Repository/ResourceAPI/RenderMathML")) { src = "http://" + src; needsModify = true; } else if (StringUtils.startsWith(src, "http://muikku.otavanopisto.fi/~Repository/ResourceAPI/RenderMathML")) { needsModify = true; } if (needsModify) { try { logger.info("Converting MathML from " + src); URL url = new URL(src); InputStream is = url.openStream(); byte[] data = {}; try { data = IOUtils.toByteArray(is); } finally { is.close(); } String name = "mathml" + StringUtils.leftPad(++imageCounter + "", 3, '0') + ".png"; String license = null; BinaryMaterial material = binaryMaterialController.createBinaryMaterial(name, "image/png", data, license); WorkspaceMaterial workspaceMaterial = workspaceMaterialController.createWorkspaceMaterial(getWorkspaceMaterial(), material); String workspaceUrl = StringUtils.prependIfMissing(workspaceMaterialController.getCompletePath(workspaceMaterial), "/"); logger.info("MathML converted to " + workspaceUrl); element.setAttribute("src", workspaceUrl); element.removeAttribute("ix_mathml"); element.removeAttribute("ix_mathmldata"); markModified(); } catch (Exception e) { logger.log(Level.SEVERE, "Failed to process MathML from URL " + src, e); } } } } @Override public Integer getPriority() { return PRIORITY_HIGH; } }