Fix AR-1464: Locale is carried into and out of the Content stack.

ApplicationContextHelper now gives out a singleton ApplicationContext and includes a 'closeApplicationContext' method.
Pulled all "org.alfresco.repo.content/**Test" classes into a single test suite.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5722 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-05-18 14:26:08 +00:00
parent 7649017ac0
commit e3223d97fb
24 changed files with 288 additions and 143 deletions

View File

@@ -33,15 +33,15 @@ import java.nio.channels.FileLock;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.util.List; import java.util.List;
import java.util.Locale;
import org.alfresco.error.StackTraceUtil; import org.alfresco.error.StackTraceUtil;
import org.alfresco.i18n.I18NUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.TransactionUtil;
import org.alfresco.service.cmr.repository.ContentAccessor; import org.alfresco.service.cmr.repository.ContentAccessor;
import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentIOException;
import org.alfresco.service.cmr.repository.ContentStreamListener; import org.alfresco.service.cmr.repository.ContentStreamListener;
import org.alfresco.service.transaction.TransactionService;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice; import org.springframework.aop.AfterReturningAdvice;
@@ -66,12 +66,12 @@ public abstract class AbstractContentAccessor implements ContentAccessor
private StackTraceElement[] traceLoggerChannelAssignTrace; private StackTraceElement[] traceLoggerChannelAssignTrace;
/** when set, ensures that listeners are executed within a transaction */ /** when set, ensures that listeners are executed within a transaction */
// private TransactionService transactionService;
private RetryingTransactionHelper transactionHelper; private RetryingTransactionHelper transactionHelper;
private String contentUrl; private String contentUrl;
private String mimetype; private String mimetype;
private String encoding; private String encoding;
private Locale locale;
/** /**
* @param contentUrl the content URL * @param contentUrl the content URL
@@ -86,6 +86,8 @@ public abstract class AbstractContentAccessor implements ContentAccessor
// the default encoding is Java's default encoding // the default encoding is Java's default encoding
encoding = "UTF-8"; encoding = "UTF-8";
// the default locale
locale = I18NUtil.getLocale();
} }
@Override @Override
@@ -115,36 +117,17 @@ public abstract class AbstractContentAccessor implements ContentAccessor
.append(", mimetype=").append(getMimetype()) .append(", mimetype=").append(getMimetype())
.append(", size=").append(getSize()) .append(", size=").append(getSize())
.append(", encoding=").append(getEncoding()) .append(", encoding=").append(getEncoding())
.append(", locale=").append(getLocale())
.append("]"); .append("]");
return sb.toString(); return sb.toString();
} }
public ContentData getContentData() public ContentData getContentData()
{ {
ContentData property = new ContentData(contentUrl, mimetype, getSize(), encoding); ContentData property = new ContentData(contentUrl, mimetype, getSize(), encoding, locale);
return property; return property;
} }
/**
* Provides access to transactions for implementing classes
*
* @return Returns a source of user transactions
*/
// protected TransactionService getTransactionService()
// {
// return transactionService;
// }
/**
* Set the transaction provider to be used by {@link ContentStreamListener listeners}.
*
* @param transactionService the transaction service to wrap callback code in
*/
// public void setTransactionService(TransactionService transactionService)
// {
// this.transactionService = transactionService;
// }
public void setRetryingTransactionHelper(RetryingTransactionHelper helper) public void setRetryingTransactionHelper(RetryingTransactionHelper helper)
{ {
this.transactionHelper = helper; this.transactionHelper = helper;
@@ -199,6 +182,22 @@ public abstract class AbstractContentAccessor implements ContentAccessor
this.encoding = encoding; this.encoding = encoding;
} }
/**
* @return Returns the content locale or <tt>null</tt> if unkown
*/
public Locale getLocale()
{
return locale;
}
/**
* @param locale the content's locale, if known.
*/
public void setLocale(Locale locale)
{
this.locale = locale;
}
/** /**
* Generate a callback instance of the {@link FileChannel FileChannel}. * Generate a callback instance of the {@link FileChannel FileChannel}.
* *
@@ -264,18 +263,6 @@ public abstract class AbstractContentAccessor implements ContentAccessor
return null; return null;
} }
}; };
// TransactionUtil.TransactionWork<Object> work = new TransactionUtil.TransactionWork<Object>()
// {
// public Object doWork()
// {
// // call the listeners
// for (ContentStreamListener listener : listeners)
// {
// listener.contentStreamClosed();
// }
// return null;
// }
// };
if (transactionHelper != null) if (transactionHelper != null)
{ {
// Execute in transaction. // Execute in transaction.
@@ -372,18 +359,6 @@ public abstract class AbstractContentAccessor implements ContentAccessor
return null; return null;
} }
}; };
// TransactionUtil.TransactionWork<Object> work = new TransactionUtil.TransactionWork<Object>()
// {
// public Object doWork()
// {
// // call the listeners
// for (ContentStreamListener listener : listeners)
// {
// listener.contentStreamClosed();
// }
// return null;
// }
// };
// We're now doing this inside a Retrying transaction. // We're now doing this inside a Retrying transaction.
// NB // NB
if (transactionHelper != null) if (transactionHelper != null)

View File

@@ -35,13 +35,13 @@ import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.util.Date; import java.util.Date;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.alfresco.repo.transaction.DummyTransactionService;
import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentIOException;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentStreamListener; import org.alfresco.service.cmr.repository.ContentStreamListener;
@@ -143,12 +143,13 @@ public abstract class AbstractContentReadWriteTest extends TestCase
readerContentUrl.startsWith(ContentStore.STORE_PROTOCOL)); readerContentUrl.startsWith(ContentStore.STORE_PROTOCOL));
} }
public void testMimetypeAndEncoding() throws Exception public void testMimetypAbdEncodingAndLocale() throws Exception
{ {
ContentWriter writer = getWriter(); ContentWriter writer = getWriter();
// set mimetype and encoding // set mimetype and encoding
writer.setMimetype("text/plain"); writer.setMimetype("text/plain");
writer.setEncoding("UTF-16"); writer.setEncoding("UTF-16");
writer.setLocale(Locale.CHINESE);
// create a UTF-16 string // create a UTF-16 string
String content = "A little bit o' this and a little bit o' that"; String content = "A little bit o' this and a little bit o' that";
@@ -163,6 +164,7 @@ public abstract class AbstractContentReadWriteTest extends TestCase
assertEquals("Writer -> Reader content URL mismatch", writer.getContentUrl(), reader.getContentUrl()); assertEquals("Writer -> Reader content URL mismatch", writer.getContentUrl(), reader.getContentUrl());
assertEquals("Writer -> Reader mimetype mismatch", writer.getMimetype(), reader.getMimetype()); assertEquals("Writer -> Reader mimetype mismatch", writer.getMimetype(), reader.getMimetype());
assertEquals("Writer -> Reader encoding mismatch", writer.getEncoding(), reader.getEncoding()); assertEquals("Writer -> Reader encoding mismatch", writer.getEncoding(), reader.getEncoding());
assertEquals("Writer -> Reader locale mismatch", writer.getLocale(), reader.getLocale());
// now get the string directly from the reader // now get the string directly from the reader
String contentCheck = reader.getContentString(); // internally it should have taken care of the encoding String contentCheck = reader.getContentString(); // internally it should have taken care of the encoding
@@ -204,6 +206,7 @@ public abstract class AbstractContentReadWriteTest extends TestCase
long before = System.currentTimeMillis(); long before = System.currentTimeMillis();
writer.setMimetype("text/plain"); writer.setMimetype("text/plain");
writer.setEncoding("UTF-8"); writer.setEncoding("UTF-8");
writer.setLocale(Locale.CHINESE);
writer.putContent(content); writer.putContent(content);
long after = System.currentTimeMillis(); long after = System.currentTimeMillis();
@@ -212,12 +215,14 @@ public abstract class AbstractContentReadWriteTest extends TestCase
assertEquals("URL incorrect", writer.getContentUrl(), readerFromWriter.getContentUrl()); assertEquals("URL incorrect", writer.getContentUrl(), readerFromWriter.getContentUrl());
assertEquals("Mimetype incorrect", writer.getMimetype(), readerFromWriter.getMimetype()); assertEquals("Mimetype incorrect", writer.getMimetype(), readerFromWriter.getMimetype());
assertEquals("Encoding incorrect", writer.getEncoding(), readerFromWriter.getEncoding()); assertEquals("Encoding incorrect", writer.getEncoding(), readerFromWriter.getEncoding());
assertEquals("Locale incorrect", writer.getLocale(), readerFromWriter.getLocale());
// get another reader from the reader // get another reader from the reader
ContentReader readerFromReader = readerFromWriter.getReader(); ContentReader readerFromReader = readerFromWriter.getReader();
assertEquals("URL incorrect", writer.getContentUrl(), readerFromReader.getContentUrl()); assertEquals("URL incorrect", writer.getContentUrl(), readerFromReader.getContentUrl());
assertEquals("Mimetype incorrect", writer.getMimetype(), readerFromReader.getMimetype()); assertEquals("Mimetype incorrect", writer.getMimetype(), readerFromReader.getMimetype());
assertEquals("Encoding incorrect", writer.getEncoding(), readerFromReader.getEncoding()); assertEquals("Encoding incorrect", writer.getEncoding(), readerFromReader.getEncoding());
assertEquals("Locale incorrect", writer.getLocale(), readerFromReader.getLocale());
// check the content // check the content
String contentCheck = readerFromWriter.getContentString(); String contentCheck = readerFromWriter.getContentString();

View File

@@ -124,6 +124,7 @@ public abstract class AbstractContentReader extends AbstractContentAccessor impl
// copy across common attributes // copy across common attributes
reader.setMimetype(this.getMimetype()); reader.setMimetype(this.getMimetype());
reader.setEncoding(this.getEncoding()); reader.setEncoding(this.getEncoding());
reader.setLocale(this.getLocale());
// done // done
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {

View File

@@ -139,6 +139,7 @@ public abstract class AbstractContentWriter extends AbstractContentAccessor impl
// copy across common attributes // copy across common attributes
reader.setMimetype(this.getMimetype()); reader.setMimetype(this.getMimetype());
reader.setEncoding(this.getEncoding()); reader.setEncoding(this.getEncoding());
reader.setLocale(this.getLocale());
// done // done
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {

View File

@@ -22,13 +22,14 @@
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" * http://www.alfresco.com/legal/licensing"
*/ */
package org.alfresco.service.cmr.repository; package org.alfresco.repo.content;
import java.util.Locale; import java.util.Locale;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.alfresco.i18n.I18NUtil; import org.alfresco.i18n.I18NUtil;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
/** /**

View File

@@ -0,0 +1,91 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.content;
import org.alfresco.repo.content.cleanup.ContentStoreCleanerTest;
import org.alfresco.repo.content.filestore.FileContentStoreTest;
import org.alfresco.repo.content.filestore.NoRandomAccessFileContentStoreTest;
import org.alfresco.repo.content.metadata.HtmlMetadataExtracterTest;
import org.alfresco.repo.content.metadata.MappingMetadataExtracterTest;
import org.alfresco.repo.content.metadata.OfficeMetadataExtracterTest;
import org.alfresco.repo.content.metadata.OpenDocumentMetadataExtracterTest;
import org.alfresco.repo.content.metadata.OpenOfficeMetadataExtracterTest;
import org.alfresco.repo.content.metadata.PdfBoxMetadataExtracterTest;
import org.alfresco.repo.content.replication.ContentStoreReplicatorTest;
import org.alfresco.repo.content.replication.ReplicatingContentStoreTest;
import org.alfresco.repo.content.transform.BinaryPassThroughContentTransformerTest;
import org.alfresco.repo.content.transform.ComplexContentTransformerTest;
import org.alfresco.repo.content.transform.ContentTransformerRegistryTest;
import org.alfresco.repo.content.transform.HtmlParserContentTransformerTest;
import org.alfresco.repo.content.transform.OpenOfficeContentTransformerTest;
import org.alfresco.repo.content.transform.PdfBoxContentTransformerTest;
import org.alfresco.repo.content.transform.PoiHssfContentTransformerTest;
import org.alfresco.repo.content.transform.RuntimeExecutableContentTransformerTest;
import org.alfresco.repo.content.transform.StringExtractingContentTransformerTest;
import org.alfresco.repo.content.transform.TextMiningContentTransformerTest;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* Suite for content-related tests.
*
* @author Derek Hulley
*/
public class ContentTestSuite extends TestSuite
{
public static Test suite()
{
TestSuite suite = new TestSuite();
suite.addTestSuite(ContentStoreCleanerTest.class);
suite.addTestSuite(ContentStoreCleanerTest.class);
suite.addTestSuite(FileContentStoreTest.class);
suite.addTestSuite(NoRandomAccessFileContentStoreTest.class);
suite.addTestSuite(MappingMetadataExtracterTest.class);
suite.addTestSuite(HtmlMetadataExtracterTest.class);
suite.addTestSuite(OfficeMetadataExtracterTest.class);
suite.addTestSuite(OpenDocumentMetadataExtracterTest.class);
suite.addTestSuite(OpenOfficeMetadataExtracterTest.class);
suite.addTestSuite(PdfBoxMetadataExtracterTest.class);
suite.addTestSuite(ContentStoreReplicatorTest.class);
suite.addTestSuite(ReplicatingContentStoreTest.class);
suite.addTestSuite(BinaryPassThroughContentTransformerTest.class);
suite.addTestSuite(ComplexContentTransformerTest.class);
suite.addTestSuite(ContentTransformerRegistryTest.class);
suite.addTestSuite(HtmlParserContentTransformerTest.class);
suite.addTestSuite(OpenOfficeContentTransformerTest.class);
suite.addTestSuite(PdfBoxContentTransformerTest.class);
suite.addTestSuite(PoiHssfContentTransformerTest.class);
suite.addTestSuite(RuntimeExecutableContentTransformerTest.class);
suite.addTestSuite(StringExtractingContentTransformerTest.class);
suite.addTestSuite(TextMiningContentTransformerTest.class);
suite.addTestSuite(ContentDataTest.class);
suite.addTestSuite(MimetypeMapTest.class);
suite.addTestSuite(RoutingContentServiceTest.class);
return suite;
}
}

View File

@@ -26,26 +26,35 @@ package org.alfresco.repo.content;
import java.util.Map; import java.util.Map;
import org.alfresco.util.BaseSpringTest; import junit.framework.TestCase;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.util.ApplicationContextHelper;
import org.springframework.context.ApplicationContext;
/** /**
* @see org.alfresco.repo.content.MimetypeMap * @see org.alfresco.repo.content.MimetypeMap
* *
* @author Derek Hulley * @author Derek Hulley
*/ */
public class MimetypeMapTest extends BaseSpringTest public class MimetypeMapTest extends TestCase
{ {
private MimetypeMap mimetypeMap; private static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
public void setMimetypeMap(MimetypeMap mimetypeMap) private MimetypeService mimetypeService;
@Override
public void setUp() throws Exception
{ {
this.mimetypeMap = mimetypeMap; ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
mimetypeService = serviceRegistry.getMimetypeService();
} }
public void testExtensions() throws Exception public void testExtensions() throws Exception
{ {
Map<String, String> extensionsByMimetype = mimetypeMap.getExtensionsByMimetype(); Map<String, String> extensionsByMimetype = mimetypeService.getExtensionsByMimetype();
Map<String, String> mimetypesByExtension = mimetypeMap.getMimetypesByExtension(); Map<String, String> mimetypesByExtension = mimetypeService.getMimetypesByExtension();
// plain text // plain text
assertEquals("txt", extensionsByMimetype.get("text/plain")); assertEquals("txt", extensionsByMimetype.get("text/plain"));

View File

@@ -319,6 +319,7 @@ public class RoutingContentService implements ContentService
// set extra data on the reader // set extra data on the reader
reader.setMimetype(contentData.getMimetype()); reader.setMimetype(contentData.getMimetype());
reader.setEncoding(contentData.getEncoding()); reader.setEncoding(contentData.getEncoding());
reader.setLocale(contentData.getLocale());
// Fire the content read policy // Fire the content read policy
if (reader != null && fireContentReadPolicy == true) if (reader != null && fireContentReadPolicy == true)
@@ -372,6 +373,7 @@ public class RoutingContentService implements ContentService
ContentData contentData = (ContentData)contentValue; ContentData contentData = (ContentData)contentValue;
writer.setMimetype(contentData.getMimetype()); writer.setMimetype(contentData.getMimetype());
writer.setEncoding(contentData.getEncoding()); writer.setEncoding(contentData.getEncoding());
writer.setLocale(contentData.getLocale());
} }
// attach a listener if required // attach a listener if required

View File

@@ -27,6 +27,7 @@ package org.alfresco.repo.content;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Locale;
import javax.transaction.RollbackException; import javax.transaction.RollbackException;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
@@ -107,7 +108,7 @@ public class RoutingContentServiceTest extends TestCase
} }
rootNodeRef = nodeService.getRootNode(storeRef); rootNodeRef = nodeService.getRootNode(storeRef);
// create a content node // create a content node
ContentData contentData = new ContentData(null, "text/plain", 0L, "UTF-16"); ContentData contentData = new ContentData(null, "text/plain", 0L, "UTF-16", Locale.CHINESE);
PropertyMap properties = new PropertyMap(); PropertyMap properties = new PropertyMap();
properties.put(ContentModel.PROP_CONTENT, contentData); properties.put(ContentModel.PROP_CONTENT, contentData);
@@ -173,7 +174,8 @@ public class RoutingContentServiceTest extends TestCase
// write some content // write some content
writer.putContent(SOME_CONTENT); writer.putContent(SOME_CONTENT);
writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
writer.setEncoding("UTF8"); writer.setEncoding("UTF-16");
writer.setLocale(Locale.CHINESE);
// set the content property manually // set the content property manually
nodeService.setProperty(contentNodeRef, ContentModel.PROP_CONTENT, writer.getContentData()); nodeService.setProperty(contentNodeRef, ContentModel.PROP_CONTENT, writer.getContentData());
@@ -182,6 +184,8 @@ public class RoutingContentServiceTest extends TestCase
ContentReader reader = contentService.getReader(contentNodeRef, ContentModel.PROP_CONTENT); ContentReader reader = contentService.getReader(contentNodeRef, ContentModel.PROP_CONTENT);
assertNotNull("Reader should not be null", reader); assertNotNull("Reader should not be null", reader);
assertNotNull("Content URL should not be null", reader.getContentUrl()); assertNotNull("Content URL should not be null", reader.getContentUrl());
assertEquals("Content Encoding was not set", "UTF-16", reader.getEncoding());
assertEquals("Content Locale was not set", Locale.CHINESE, reader.getLocale());
} }
/** /**
@@ -196,6 +200,7 @@ public class RoutingContentServiceTest extends TestCase
assertNotNull("Content URL should not be null", writer.getContentUrl()); assertNotNull("Content URL should not be null", writer.getContentUrl());
assertNotNull("Content mimetype should not be null", writer.getMimetype()); assertNotNull("Content mimetype should not be null", writer.getMimetype());
assertNotNull("Content encoding should not be null", writer.getEncoding()); assertNotNull("Content encoding should not be null", writer.getEncoding());
assertNotNull("Content locale should not be null", writer.getLocale());
// write some content // write some content
writer.putContent(SOME_CONTENT); writer.putContent(SOME_CONTENT);
@@ -206,6 +211,7 @@ public class RoutingContentServiceTest extends TestCase
assertNotNull("Content URL should not be null", reader.getContentUrl()); assertNotNull("Content URL should not be null", reader.getContentUrl());
assertNotNull("Content mimetype should not be null", reader.getMimetype()); assertNotNull("Content mimetype should not be null", reader.getMimetype());
assertNotNull("Content encoding should not be null", reader.getEncoding()); assertNotNull("Content encoding should not be null", reader.getEncoding());
assertNotNull("Content locale should not be null", reader.getLocale());
// check that the content length is correct // check that the content length is correct
// - note encoding is important as we get the byte length // - note encoding is important as we get the byte length
@@ -223,8 +229,9 @@ public class RoutingContentServiceTest extends TestCase
// previously, the node was populated with the mimetype, etc // previously, the node was populated with the mimetype, etc
// check that the write has these // check that the write has these
ContentWriter writer = contentService.getWriter(contentNodeRef, ContentModel.PROP_CONTENT, true); ContentWriter writer = contentService.getWriter(contentNodeRef, ContentModel.PROP_CONTENT, true);
assertNotNull(writer.getMimetype()); assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, writer.getMimetype());
assertNotNull(writer.getEncoding()); assertEquals("UTF-16", writer.getEncoding());
assertEquals(Locale.CHINESE, writer.getLocale());
// now remove the content property from the node // now remove the content property from the node
nodeService.setProperty(contentNodeRef, ContentModel.PROP_CONTENT, null); nodeService.setProperty(contentNodeRef, ContentModel.PROP_CONTENT, null);
@@ -232,10 +239,12 @@ public class RoutingContentServiceTest extends TestCase
writer = contentService.getWriter(contentNodeRef, ContentModel.PROP_CONTENT, true); writer = contentService.getWriter(contentNodeRef, ContentModel.PROP_CONTENT, true);
assertNull(writer.getMimetype()); assertNull(writer.getMimetype());
assertEquals("UTF-8", writer.getEncoding()); assertEquals("UTF-8", writer.getEncoding());
assertEquals(Locale.getDefault(), writer.getLocale());
// now set it on the writer // now set it on the writer
writer.setMimetype("text/plain"); writer.setMimetype("text/plain");
writer.setEncoding("UTF-8"); writer.setEncoding("UTF-16");
writer.setLocale(Locale.FRENCH);
String content = "The quick brown fox ..."; String content = "The quick brown fox ...";
writer.putContent(content); writer.putContent(content);

View File

@@ -46,7 +46,7 @@ import org.alfresco.service.namespace.QName;
* *
* @author Derek Hulley * @author Derek Hulley
*/ */
public class AbstractMappingMetadataExtracterTest extends TestCase public class MappingMetadataExtracterTest extends TestCase
{ {
private DummyMappingMetadataExtracter extracter; private DummyMappingMetadataExtracter extracter;
private ContentReader reader; private ContentReader reader;

View File

@@ -32,13 +32,20 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import junit.framework.TestCase;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.filestore.FileContentReader; import org.alfresco.repo.content.filestore.FileContentReader;
import org.alfresco.repo.content.filestore.FileContentWriter; import org.alfresco.repo.content.filestore.FileContentWriter;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.util.BaseSpringTest; import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
/** /**
* Provides a base set of tests for testing * Provides a base set of tests for testing
@@ -47,18 +54,18 @@ import org.alfresco.util.TempFileProvider;
* *
* @author Derek Hulley * @author Derek Hulley
*/ */
public abstract class AbstractContentTransformerTest extends BaseSpringTest public abstract class AbstractContentTransformerTest extends TestCase
{ {
private static String QUICK_CONTENT = "The quick brown fox jumps over the lazy dog"; private static String QUICK_CONTENT = "The quick brown fox jumps over the lazy dog";
private static String[] QUICK_WORDS = new String[] { private static String[] QUICK_WORDS = new String[] {
"quick", "brown", "fox", "jumps", "lazy", "dog"}; "quick", "brown", "fox", "jumps", "lazy", "dog"};
protected MimetypeMap mimetypeMap; private static Log logger = LogFactory.getLog(AbstractContentTransformerTest.class);
public final void setMimetypeMap(MimetypeMap mimetypeMap) protected static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
{
this.mimetypeMap = mimetypeMap; protected ServiceRegistry serviceRegistry;
} protected MimetypeService mimetypeService;
/** /**
* Fetches a transformer to test for a given transformation. The transformer * Fetches a transformer to test for a given transformation. The transformer
@@ -77,8 +84,10 @@ public abstract class AbstractContentTransformerTest extends BaseSpringTest
* Ensures that the temp locations are cleaned out before the tests start * Ensures that the temp locations are cleaned out before the tests start
*/ */
@Override @Override
protected void onSetUpInTransaction() throws Exception protected void setUp() throws Exception
{ {
serviceRegistry = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
mimetypeService = serviceRegistry.getMimetypeService();
// perform a little cleaning up // perform a little cleaning up
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
TempFileProvider.TempFileCleanerJob.removeFiles(now); TempFileProvider.TempFileCleanerJob.removeFiles(now);
@@ -89,7 +98,7 @@ public abstract class AbstractContentTransformerTest extends BaseSpringTest
*/ */
public void testSetUp() throws Exception public void testSetUp() throws Exception
{ {
assertNotNull("MimetypeMap not present", mimetypeMap); assertNotNull("MimetypeMap not present", mimetypeService);
// check that the quick resources are available // check that the quick resources are available
File sourceFile = AbstractContentTransformerTest.loadQuickTestFile("txt"); File sourceFile = AbstractContentTransformerTest.loadQuickTestFile("txt");
assertNotNull(sourceFile); assertNotNull(sourceFile);
@@ -144,11 +153,11 @@ public abstract class AbstractContentTransformerTest extends BaseSpringTest
.append("\n"); .append("\n");
// get all mimetypes // get all mimetypes
Set<String> mimetypes = new TreeSet<String>(mimetypeMap.getMimetypes()); Set<String> mimetypes = new TreeSet<String>(mimetypeService.getMimetypes());
for (String sourceMimetype : mimetypes) for (String sourceMimetype : mimetypes)
{ {
// attempt to get a source file for each mimetype // attempt to get a source file for each mimetype
String sourceExtension = mimetypeMap.getExtension(sourceMimetype); String sourceExtension = mimetypeService.getExtension(sourceMimetype);
sb.append(" Source Extension: ").append(sourceExtension).append("\n"); sb.append(" Source Extension: ").append(sourceExtension).append("\n");
@@ -157,7 +166,7 @@ public abstract class AbstractContentTransformerTest extends BaseSpringTest
{ {
ContentWriter targetWriter = null; ContentWriter targetWriter = null;
// construct a reader onto the source file // construct a reader onto the source file
String targetExtension = mimetypeMap.getExtension(targetMimetype); String targetExtension = mimetypeService.getExtension(targetMimetype);
// must we test the transformation? // must we test the transformation?
ContentTransformer transformer = getTransformer(sourceMimetype, targetMimetype); ContentTransformer transformer = getTransformer(sourceMimetype, targetMimetype);

View File

@@ -25,8 +25,6 @@
package org.alfresco.repo.content.transform; package org.alfresco.repo.content.transform;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @see org.alfresco.repo.content.transform.BinaryPassThroughContentTransformer * @see org.alfresco.repo.content.transform.BinaryPassThroughContentTransformer
@@ -35,12 +33,13 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class BinaryPassThroughContentTransformerTest extends AbstractContentTransformerTest public class BinaryPassThroughContentTransformerTest extends AbstractContentTransformerTest
{ {
private static final Log logger = LogFactory.getLog(BinaryPassThroughContentTransformerTest.class);
private ContentTransformer transformer; private ContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
transformer = new BinaryPassThroughContentTransformer(); transformer = new BinaryPassThroughContentTransformer();
} }

View File

@@ -42,10 +42,13 @@ public class ComplexContentTransformerTest extends AbstractContentTransformerTes
private ComplexContentTransformer transformer; private ComplexContentTransformer transformer;
private boolean isAvailable; private boolean isAvailable;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
ContentTransformer unoTransformer = (ContentTransformer) applicationContext.getBean("transformer.OpenOffice"); super.setUp();
ContentTransformer pdfBoxTransformer = (ContentTransformer) applicationContext.getBean("transformer.PdfBox");
ContentTransformer unoTransformer = (ContentTransformer) ctx.getBean("transformer.OpenOffice");
ContentTransformer pdfBoxTransformer = (ContentTransformer) ctx.getBean("transformer.PdfBox");
// make sure that they are working for this test // make sure that they are working for this test
if (unoTransformer.getReliability(MimetypeMap.MIMETYPE_PPT, MimetypeMap.MIMETYPE_PDF) == 0.0) if (unoTransformer.getReliability(MimetypeMap.MIMETYPE_PPT, MimetypeMap.MIMETYPE_PDF) == 0.0)
{ {
@@ -63,7 +66,7 @@ public class ComplexContentTransformerTest extends AbstractContentTransformerTes
} }
transformer = new ComplexContentTransformer(); transformer = new ComplexContentTransformer();
transformer.setMimetypeService(mimetypeMap); transformer.setMimetypeService(mimetypeService);
// set the transformer list // set the transformer list
List<ContentTransformer> transformers = new ArrayList<ContentTransformer>(2); List<ContentTransformer> transformers = new ArrayList<ContentTransformer>(2);
transformers.add(unoTransformer); transformers.add(unoTransformer);

View File

@@ -55,17 +55,13 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe
private ContentReader reader; private ContentReader reader;
private ContentWriter writer; private ContentWriter writer;
/**
* Allows dependency injection
*/
public void setContentTransformerRegistry(ContentTransformerRegistry registry)
{
this.registry = registry;
}
@Override @Override
public void onSetUpInTransaction() throws Exception public void setUp() throws Exception
{ {
super.setUp();
registry = (ContentTransformerRegistry) ctx.getBean("contentTransformerRegistry");
reader = new FileContentReader(TempFileProvider.createTempFile(getName(), ".txt")); reader = new FileContentReader(TempFileProvider.createTempFile(getName(), ".txt"));
reader.setMimetype(A); reader.setMimetype(A);
writer = new FileContentWriter(TempFileProvider.createTempFile(getName(), ".txt")); writer = new FileContentWriter(TempFileProvider.createTempFile(getName(), ".txt"));
@@ -79,17 +75,17 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe
// create the dummyRegistry // create the dummyRegistry
dummyRegistry = new ContentTransformerRegistry(); dummyRegistry = new ContentTransformerRegistry();
// create some dummy transformers for reliability tests // create some dummy transformers for reliability tests
new DummyTransformer(mimetypeMap, dummyRegistry, A, B, 0.3, 10L); new DummyTransformer(mimetypeService, dummyRegistry, A, B, 0.3, 10L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, B, 0.6, 10L); new DummyTransformer(mimetypeService, dummyRegistry, A, B, 0.6, 10L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, C, 0.5, 10L); new DummyTransformer(mimetypeService, dummyRegistry, A, C, 0.5, 10L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, C, 1.0, 10L); new DummyTransformer(mimetypeService, dummyRegistry, A, C, 1.0, 10L);
new DummyTransformer(mimetypeMap, dummyRegistry, B, C, 0.2, 10L); new DummyTransformer(mimetypeService, dummyRegistry, B, C, 0.2, 10L);
// create some dummy transformers for speed tests // create some dummy transformers for speed tests
new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); new DummyTransformer(mimetypeService, dummyRegistry, A, D, 1.0, 20L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); new DummyTransformer(mimetypeService, dummyRegistry, A, D, 1.0, 20L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 10L); // the fast one new DummyTransformer(mimetypeService, dummyRegistry, A, D, 1.0, 10L); // the fast one
new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); new DummyTransformer(mimetypeService, dummyRegistry, A, D, 1.0, 20L);
new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); new DummyTransformer(mimetypeService, dummyRegistry, A, D, 1.0, 20L);
} }
/** /**
@@ -167,7 +163,7 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe
public void testExplicitTransformation() public void testExplicitTransformation()
{ {
AbstractContentTransformer dummyTransformer = new DummyTransformer( AbstractContentTransformer dummyTransformer = new DummyTransformer(
mimetypeMap, mimetypeService,
dummyRegistry, dummyRegistry,
MimetypeMap.MIMETYPE_FLASH, MimetypeMap.MIMETYPE_EXCEL, MimetypeMap.MIMETYPE_FLASH, MimetypeMap.MIMETYPE_EXCEL,
1.0, 12345); 1.0, 12345);

View File

@@ -36,8 +36,9 @@ public class HtmlParserContentTransformerTest extends AbstractContentTransformer
private ContentTransformer transformer; private ContentTransformer transformer;
@Override @Override
public void onSetUpInTransaction() throws Exception public void setUp() throws Exception
{ {
super.setUp();
transformer = new HtmlParserContentTransformer(); transformer = new HtmlParserContentTransformer();
} }

View File

@@ -46,12 +46,15 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer
private OpenOfficeContentTransformer transformer; private OpenOfficeContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
OpenOfficeConnection connection = (OpenOfficeConnection) applicationContext.getBean("openOfficeConnection"); super.setUp();
OpenOfficeConnection connection = (OpenOfficeConnection) ctx.getBean("openOfficeConnection");
transformer = new OpenOfficeContentTransformer(); transformer = new OpenOfficeContentTransformer();
transformer.setMimetypeService(mimetypeMap); transformer.setMimetypeService(mimetypeService);
transformer.setConnection(connection); transformer.setConnection(connection);
transformer.setDocumentFormatsConfiguration("classpath:alfresco/mimetype/openoffice-document-formats.xml"); transformer.setDocumentFormatsConfiguration("classpath:alfresco/mimetype/openoffice-document-formats.xml");
transformer.register(); transformer.register();
@@ -68,7 +71,7 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer
public void testSetUp() throws Exception public void testSetUp() throws Exception
{ {
super.testSetUp(); super.testSetUp();
assertNotNull(mimetypeMap); assertNotNull(mimetypeService);
} }
public void testReliability() throws Exception public void testReliability() throws Exception

View File

@@ -25,8 +25,6 @@
package org.alfresco.repo.content.transform; package org.alfresco.repo.content.transform;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @see org.alfresco.repo.content.transform.PdfBoxContentTransformer * @see org.alfresco.repo.content.transform.PdfBoxContentTransformer
@@ -35,12 +33,13 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class PdfBoxContentTransformerTest extends AbstractContentTransformerTest public class PdfBoxContentTransformerTest extends AbstractContentTransformerTest
{ {
private static final Log logger = LogFactory.getLog(PdfBoxContentTransformerTest.class);
private ContentTransformer transformer; private ContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
transformer = new PdfBoxContentTransformer(); transformer = new PdfBoxContentTransformer();
} }

View File

@@ -31,8 +31,6 @@ import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.filestore.FileContentWriter; import org.alfresco.repo.content.filestore.FileContentWriter;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @see org.alfresco.repo.content.transform.PoiHssfContentTransformer * @see org.alfresco.repo.content.transform.PoiHssfContentTransformer
@@ -41,12 +39,13 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class PoiHssfContentTransformerTest extends AbstractContentTransformerTest public class PoiHssfContentTransformerTest extends AbstractContentTransformerTest
{ {
private static final Log logger = LogFactory.getLog(PoiHssfContentTransformerTest.class);
private ContentTransformer transformer; private ContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
transformer = new PoiHssfContentTransformer(); transformer = new PoiHssfContentTransformer();
} }

View File

@@ -66,8 +66,10 @@ public class StringExtractingContentTransformerTest extends AbstractContentTrans
private ContentWriter targetWriter; private ContentWriter targetWriter;
@Override @Override
public void onSetUpInTransaction() throws Exception public void setUp() throws Exception
{ {
super.setUp();
transformer = new StringExtractingContentTransformer(); transformer = new StringExtractingContentTransformer();
targetWriter = new FileContentWriter(getTempFile()); targetWriter = new FileContentWriter(getTempFile());
targetWriter.setMimetype("text/plain"); targetWriter.setMimetype("text/plain");

View File

@@ -31,8 +31,6 @@ import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.filestore.FileContentWriter; import org.alfresco.repo.content.filestore.FileContentWriter;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @see org.alfresco.repo.content.transform.TextMiningContentTransformer * @see org.alfresco.repo.content.transform.TextMiningContentTransformer
@@ -41,12 +39,13 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class TextMiningContentTransformerTest extends AbstractContentTransformerTest public class TextMiningContentTransformerTest extends AbstractContentTransformerTest
{ {
private static final Log logger = LogFactory.getLog(TextMiningContentTransformerTest.class);
private ContentTransformer transformer; private ContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
transformer = new TextMiningContentTransformer(); transformer = new TextMiningContentTransformer();
} }

View File

@@ -40,14 +40,17 @@ public class ImageMagickContentTransformerTest extends AbstractContentTransforme
{ {
private ImageMagickContentTransformer transformer; private ImageMagickContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
RuntimeExec executer = new RuntimeExec(); RuntimeExec executer = new RuntimeExec();
executer.setCommand("imconvert.exe ${source} ${options} ${target}"); executer.setCommand("imconvert.exe ${source} ${options} ${target}");
executer.setDefaultProperties(Collections.singletonMap("options", "")); executer.setDefaultProperties(Collections.singletonMap("options", ""));
transformer = new ImageMagickContentTransformer(); transformer = new ImageMagickContentTransformer();
transformer.setMimetypeService(mimetypeMap); transformer.setMimetypeService(mimetypeService);
transformer.setExecuter(executer); transformer.setExecuter(executer);
transformer.init(); transformer.init();
} }

View File

@@ -27,8 +27,6 @@ package org.alfresco.repo.content.transform.magick;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.content.transform.AbstractContentTransformerTest;
import org.alfresco.repo.content.transform.ContentTransformer; import org.alfresco.repo.content.transform.ContentTransformer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @see org.alfresco.repo.content.transform.magick.JMagickContentTransformer * @see org.alfresco.repo.content.transform.magick.JMagickContentTransformer
@@ -37,14 +35,15 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class JMagickContentTransformerTest extends AbstractContentTransformerTest public class JMagickContentTransformerTest extends AbstractContentTransformerTest
{ {
private static final Log logger = LogFactory.getLog(JMagickContentTransformerTest.class);
private JMagickContentTransformer transformer; private JMagickContentTransformer transformer;
public void onSetUpInTransaction() throws Exception @Override
public void setUp() throws Exception
{ {
super.setUp();
transformer = new JMagickContentTransformer(); transformer = new JMagickContentTransformer();
transformer.setMimetypeService(mimetypeMap); transformer.setMimetypeService(mimetypeService);
transformer.init(); transformer.init();
} }

View File

@@ -24,6 +24,8 @@
*/ */
package org.alfresco.service.cmr.repository; package org.alfresco.service.cmr.repository;
import java.util.Locale;
import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.service.transaction.TransactionService; import org.alfresco.service.transaction.TransactionService;
@@ -120,4 +122,18 @@ public interface ContentAccessor
* @param encoding a java-recognised encoding format * @param encoding a java-recognised encoding format
*/ */
public void setEncoding(String encoding); public void setEncoding(String encoding);
/**
* Get the locale of the content being accessed
*
* @return Returns a valid java Locale
*/
public Locale getLocale();
/**
* Set the <code>Locale</code> for this accessor
*
* @param locale a java-recognised locale
*/
public void setLocale(Locale locale);
} }

View File

@@ -35,17 +35,40 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
*/ */
public class ApplicationContextHelper public class ApplicationContextHelper
{ {
private static ClassPathXmlApplicationContext instance;
/** location of required configuration files */ /** location of required configuration files */
public static final String[] CONFIG_LOCATIONS = new String[] { "classpath:alfresco/application-context.xml" }; public static final String[] CONFIG_LOCATIONS = new String[] { "classpath:alfresco/application-context.xml" };
/** /**
* Instantiates a new application context. * Provides a static, single instance of the application context. This method can be
* called repeatedly.
* *
* @return Returns a new application context * @return Returns a new application context
*/ */
public static ApplicationContext getApplicationContext() public synchronized static ApplicationContext getApplicationContext()
{ {
return new ClassPathXmlApplicationContext(CONFIG_LOCATIONS); if (instance != null)
{
return instance;
}
instance = new ClassPathXmlApplicationContext(CONFIG_LOCATIONS);
return instance;
}
/**
* Closes and releases the application context. On the next call to
* {@link #getApplicationContext()}, a new context will be given.
*/
public synchronized void closeApplicationContext()
{
if (instance == null)
{
// Nothing to do
return;
}
instance.close();
instance = null;
} }
public static void main(String ... args) public static void main(String ... args)