From c246edcef3914ebf7a349a751eff64b9d35b60f6 Mon Sep 17 00:00:00 2001 From: Jan Vonka Date: Fri, 9 Jan 2009 13:07:34 +0000 Subject: [PATCH] Merged DEV/JASONH to HEAD 12169: JCR - guess/set mime type and encoding ... means that doc added via JCR will display properly if clicked on in the web client 12634: JCR - add test for JAWS-191 (r12169) improvement and wrap debug git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12654 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../java/org/alfresco/jcr/item/ItemTest.java | 111 +++++++++++++++++- .../org/alfresco/jcr/item/PropertyImpl.java | 37 +++++- .../java/org/alfresco/jcr/test/testQuick.jpg | Bin 0 -> 26445 bytes 3 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 source/java/org/alfresco/jcr/test/testQuick.jpg diff --git a/source/java/org/alfresco/jcr/item/ItemTest.java b/source/java/org/alfresco/jcr/item/ItemTest.java index 1992ed2fae..a5083c82f5 100644 --- a/source/java/org/alfresco/jcr/item/ItemTest.java +++ b/source/java/org/alfresco/jcr/item/ItemTest.java @@ -24,6 +24,8 @@ */ package org.alfresco.jcr.item; +import java.io.InputStream; + import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -52,6 +54,8 @@ public class ItemTest extends BaseJCRTest { protected Session session; + private static final String QUICK_TXT = "The quick brown fox jumps over the lazy dog"; + @Override protected void setUp() throws Exception { @@ -161,11 +165,10 @@ public class ItemTest extends BaseJCRTest // // write some content to new node // - content.setProperty("cm:content", "The quick brown fox jumps over the lazy dog"); + content.setProperty("cm:content", QUICK_TXT); // use Alfresco native API to set mimetype ServiceRegistry registry = (ServiceRegistry)applicationContext.getBean(ServiceRegistry.SERVICE_REGISTRY); - setMimetype(registry, content, "cm:content", MimetypeMap.MIMETYPE_TEXT_PLAIN); // enable versioning capability @@ -228,6 +231,100 @@ public class ItemTest extends BaseJCRTest } } + public void test_JAWS_191() throws RepositoryException + { + SimpleCredentials user = new SimpleCredentials("admin", "admin".toCharArray()); + + session = repository.login(user, "SpacesStore"); + + String runid = ""+System.currentTimeMillis(); + String pathname = "cm:JCR-"+runid+".jpg"; + + String name = "JCR Sample ("+runid+")"; + + try + { + Node rootNode = session.getRootNode(); + Node companyHome = rootNode.getNode("app:company_home"); + + // create the content node + Node content = companyHome.addNode(pathname, "cm:content"); + content.setProperty("cm:name", name); + + // add titled aspect (for Web Client display) + content.addMixin("cm:titled"); + content.setProperty("cm:title", name); + content.setProperty("cm:description", name); + + InputStream is = getClass().getClassLoader().getResourceAsStream("org/alfresco/jcr/test/testQuick.jpg"); + assertNotNull(is); + + // + // write some content to new node + // + content.setProperty("cm:content", is); + + // save changes + session.save(); + + content = companyHome.getNode(pathname); + + // use Alfresco native API to get content data (for mimetype / encoding) + ServiceRegistry registry = (ServiceRegistry)applicationContext.getBean(ServiceRegistry.SERVICE_REGISTRY); + ContentData contentData = getContentData(registry, content); + + assertEquals(MimetypeMap.MIMETYPE_IMAGE_JPEG, contentData.getMimetype()); + assertEquals("UTF-8", contentData.getEncoding()); + } + finally + { + if (session != null) { session.logout(); } + } + + session = repository.login(user, "SpacesStore"); + + runid = ""+System.currentTimeMillis(); + pathname = "cm:JCR-"+runid+".txt"; + + name = "JCR Sample ("+runid+")"; + + try + { + Node rootNode = session.getRootNode(); + Node companyHome = rootNode.getNode("app:company_home"); + + // create the content node + Node content = companyHome.addNode(pathname, "cm:content"); + content.setProperty("cm:name", name); + + // add titled aspect (for Web Client display) + content.addMixin("cm:titled"); + content.setProperty("cm:title", name); + content.setProperty("cm:description", name); + + // + // write some content to new node + // + content.setProperty("cm:content", QUICK_TXT); + + // save changes + session.save(); + + content = companyHome.getNode(pathname); + + // use Alfresco native API to get content data (for mimetype / encoding) + ServiceRegistry registry = (ServiceRegistry)applicationContext.getBean(ServiceRegistry.SERVICE_REGISTRY); + ContentData contentData = getContentData(registry, content); + + assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentData.getMimetype()); + assertEquals("UTF-8", contentData.getEncoding()); + } + finally + { + if (session != null) { session.logout(); } + } + } + private static void setMimetype(ServiceRegistry registry, Node node, String propertyName, String mimeType) throws RepositoryException { // convert the JCR Node to an Alfresco Node Reference @@ -241,4 +338,14 @@ public class ItemTest extends BaseJCRTest content = ContentData.setMimetype(content, mimeType); nodeService.setProperty(nodeRef, ContentModel.PROP_CONTENT, content); } + + private static ContentData getContentData(ServiceRegistry registry, Node node) throws RepositoryException + { + // convert the JCR Node to an Alfresco Node Reference + NodeRef nodeRef = JCRNodeRef.getNodeRef(node); + + // retrieve the Content Property (represented as a ContentData object in Alfresco) + NodeService nodeService = registry.getNodeService(); + return (ContentData)nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT); + } } diff --git a/source/java/org/alfresco/jcr/item/PropertyImpl.java b/source/java/org/alfresco/jcr/item/PropertyImpl.java index 0e4bf4d577..b2b9aa8562 100644 --- a/source/java/org/alfresco/jcr/item/PropertyImpl.java +++ b/source/java/org/alfresco/jcr/item/PropertyImpl.java @@ -24,8 +24,10 @@ */ package org.alfresco.jcr.item; +import java.io.BufferedInputStream; import java.io.InputStream; import java.io.Serializable; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -49,18 +51,21 @@ import org.alfresco.jcr.api.JCRNodeRef; import org.alfresco.jcr.dictionary.DataTypeMap; import org.alfresco.jcr.dictionary.PropertyDefinitionImpl; import org.alfresco.jcr.util.JCRProxyFactory; -import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.content.encoding.ContentCharsetFinder; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.InvalidTypeException; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.repository.datatype.TypeConversionException; import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** @@ -70,6 +75,7 @@ import org.alfresco.service.namespace.QName; */ public class PropertyImpl extends ItemImpl implements Property { + private static Log logger = LogFactory.getLog(PropertyImpl.class); private NodeImpl node; private QName name; @@ -603,9 +609,34 @@ public class PropertyImpl extends ItemImpl implements Property { ContentService contentService = session.getRepositoryImpl().getServiceRegistry().getContentService(); ContentWriter writer = contentService.getWriter(node.getNodeRef(), name, true); - writer.setMimetype(MimetypeMap.MIMETYPE_BINARY); - writer.putContent((InputStream)value); + + MimetypeService mimetypeService = session.getRepositoryImpl().getServiceRegistry().getMimetypeService(); + + String guessedMimetype = mimetypeService.guessMimetype(node.getName()); + writer.setMimetype(guessedMimetype); + + if (logger.isDebugEnabled()) + { + logger.debug("node pathname: " + node.getName()); + logger.debug("guessed mime type: " + guessedMimetype); + } + + BufferedInputStream bis = new BufferedInputStream((InputStream)value); + ContentCharsetFinder charsetFinder = mimetypeService.getContentCharsetFinder(); + Charset encoding = charsetFinder.getCharset(bis, guessedMimetype); + writer.setEncoding(encoding.name()); + + if (logger.isDebugEnabled()) + { + logger.debug("setEncoding: " + encoding.name()); + } + + writer.putContent(bis); } + catch(RepositoryException e) + { + throw new ValueFormatException(e); + } catch(InvalidTypeException e) { throw new ValueFormatException(e); diff --git a/source/java/org/alfresco/jcr/test/testQuick.jpg b/source/java/org/alfresco/jcr/test/testQuick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08473b8e8b65fa2ce2cb481ab31e5b18862e4515 GIT binary patch literal 26445 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