From a166add97f4f3378771dba4fe042c3b47963082b Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Mon, 6 Apr 2009 16:31:33 +0000 Subject: [PATCH] 3rd Party Service admin (OpenOffice, SWFTools, ImageMagick) - All supporting classes moved out to thirdparty subsystem - Open Office service automatically started if available - All utility locations editable via JMX (and subsystem can be reinitialized with new values without rebooting tomcat) - New ContentTransformerWorker interface introduced in order to allow separation between ContentTransformer registry and third party utilities - Existing JMX query capabilities preserved git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13860 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/bootstrap-context.xml | 12 +- config/alfresco/content-services-context.xml | 118 ++++++------ config/alfresco/repository.properties | 8 - config/alfresco/scheduled-jobs-context.xml | 24 --- .../fileServers/file-servers-context.xml | 170 +++++------------- .../imagemagick-transform-context.xml | 59 ++++++ .../imagemagick-transform.properties | 4 + .../openoffice-transform-context.xml | 98 ++++++++++ .../openoffice-transform.properties | 3 + .../thirdparty/swf-transform-context.xml | 57 ++++++ .../thirdparty/swf-transform.properties | 2 + config/alfresco/swf-transform-context.xml | 54 ++---- .../ImageTransformActionExecuter.java | 22 +-- .../repo/content/RoutingContentService.java | 7 +- .../DefaultOpenOfficeMetadataWorker.java | 147 +++++++++++++++ .../metadata/OpenOfficeMetadataExtracter.java | 96 ++-------- .../OpenOfficeMetadataExtracterTest.java | 5 +- .../metadata/OpenOfficeMetadataWorker.java | 46 +++++ .../AbstractContentTransformer2.java | 73 +------- .../transform/ContentTransformerHelper.java | 119 ++++++++++++ .../transform/ContentTransformerWorker.java | 56 ++++++ .../OpenOfficeContentTransformerTest.java | 21 ++- ...> OpenOfficeContentTransformerWorker.java} | 122 ++++++------- .../transform/ProxyContentTransformer.java | 68 +++++++ ...ntimeExecutableContentTransformerTest.java | 19 +- ...meExecutableContentTransformerWorker.java} | 17 +- ...tImageMagickContentTransformerWorker.java} | 33 ++-- .../ImageMagickContentTransformerTest.java | 17 +- ... ImageMagickContentTransformerWorker.java} | 25 ++- ...faultManagedApplicationContextFactory.java | 13 +- .../ManagedSubsystemProxyFactory.java | 10 ++ 31 files changed, 966 insertions(+), 559 deletions(-) create mode 100644 config/alfresco/subsystems/thirdparty/imagemagick-transform-context.xml create mode 100644 config/alfresco/subsystems/thirdparty/imagemagick-transform.properties create mode 100644 config/alfresco/subsystems/thirdparty/openoffice-transform-context.xml create mode 100644 config/alfresco/subsystems/thirdparty/openoffice-transform.properties create mode 100644 config/alfresco/subsystems/thirdparty/swf-transform-context.xml create mode 100644 config/alfresco/subsystems/thirdparty/swf-transform.properties create mode 100644 source/java/org/alfresco/repo/content/metadata/DefaultOpenOfficeMetadataWorker.java create mode 100644 source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataWorker.java create mode 100644 source/java/org/alfresco/repo/content/transform/ContentTransformerHelper.java create mode 100644 source/java/org/alfresco/repo/content/transform/ContentTransformerWorker.java rename source/java/org/alfresco/repo/content/transform/{OpenOfficeContentTransformer.java => OpenOfficeContentTransformerWorker.java} (66%) create mode 100644 source/java/org/alfresco/repo/content/transform/ProxyContentTransformer.java rename source/java/org/alfresco/repo/content/transform/{RuntimeExecutableContentTransformer.java => RuntimeExecutableContentTransformerWorker.java} (96%) rename source/java/org/alfresco/repo/content/transform/magick/{AbstractImageMagickContentTransformer.java => AbstractImageMagickContentTransformerWorker.java} (85%) rename source/java/org/alfresco/repo/content/transform/magick/{ImageMagickContentTransformer.java => ImageMagickContentTransformerWorker.java} (90%) diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index f87154d34d..4d2f7be45d 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -383,6 +383,8 @@ org.alfresco.filesys.ExtendedServerConfigurationAccessor + + org.alfresco.filesys.FileServerConfigMBean @@ -395,12 +397,10 @@ - - - - - - false + + + + true diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml index d96c7cd201..bb7203d3ac 100644 --- a/config/alfresco/content-services-context.xml +++ b/config/alfresco/content-services-context.xml @@ -129,8 +129,6 @@ - - @@ -150,7 +148,7 @@ - + @@ -158,8 +156,21 @@ - - + + + + + + + + extracter.worker.OpenOffice + + + + org.alfresco.repo.content.metadata.OpenOfficeMetadataWorker + + + @@ -172,7 +183,6 @@ - @@ -324,16 +334,25 @@ - + - - - - - - classpath:alfresco/mimetype/openoffice-document-formats.xml + + + + + + + + + transformer.worker.OpenOffice + + + + org.alfresco.repo.content.transform.ContentTransformerWorker + + + @@ -349,7 +368,7 @@ application/pdf - + @@ -357,57 +376,24 @@ class="org.alfresco.repo.content.transform.MailContentTransformer" parent="baseContentTransformer" /> - - - - - - - - ${img.exe} - ${source} - SPLIT:${options} - ${target} - - - - - - - - ${img.root} - - - ${img.dyn} - - - ${img.dyn} - - - - - - - - - + + + + - - - - - - - ${img.exe} - -version - - - - - + + transformer.worker.ImageMagick + + + + org.alfresco.repo.content.transform.ContentTransformerWorker + + + + + + + diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index fc893ba586..e2d2c7df8c 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -299,14 +299,6 @@ authentication.rmi.service.port=50504 repo.rmi.service.port=50505 action.rmi.service.port=50506 -# External executable locations -ooo.exe=soffice -ooo.user=${dir.root}/oouser -img.root=./ImageMagick -img.dyn=${img.root}/lib -img.exe=${img.root}/bin/convert -swf.exe=./bin/pdf2swf - # Property to enable upgrade from 2.1-A V2.1-A.fixes.to.schema=0 #V2.1-A.fixes.to.schema=82 diff --git a/config/alfresco/scheduled-jobs-context.xml b/config/alfresco/scheduled-jobs-context.xml index 67cd856866..e23ee83b59 100644 --- a/config/alfresco/scheduled-jobs-context.xml +++ b/config/alfresco/scheduled-jobs-context.xml @@ -175,30 +175,6 @@ - - - org.alfresco.util.OpenOfficeConnectionTester$OpenOfficeConnectionTesterJob - - - - - - - - - - - - - - - - - - ${openOffice.test.cronExpression} - - - org.alfresco.repo.search.impl.lucene.AbstractLuceneIndexerAndSearcherFactory$LuceneIndexBackupJob diff --git a/config/alfresco/subsystems/fileServers/file-servers-context.xml b/config/alfresco/subsystems/fileServers/file-servers-context.xml index b2f900d0b4..6d06b6bf7f 100644 --- a/config/alfresco/subsystems/fileServers/file-servers-context.xml +++ b/config/alfresco/subsystems/fileServers/file-servers-context.xml @@ -51,6 +51,23 @@ + + + + + + + + + + + + + + + + + ${cifs.enabled} @@ -188,9 +205,7 @@ @@ -296,79 +311,31 @@ @@ -392,67 +359,28 @@ diff --git a/config/alfresco/subsystems/thirdparty/imagemagick-transform-context.xml b/config/alfresco/subsystems/thirdparty/imagemagick-transform-context.xml new file mode 100644 index 0000000000..c212ccca4b --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/imagemagick-transform-context.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + ${img.exe} + ${source} + SPLIT:${options} + ${target} + + + + + + + + ${img.root} + + + ${img.dyn} + + + ${img.dyn} + + + + + + + + + + + + + + + + + ${img.exe} + -version + + + + + + + + + \ No newline at end of file diff --git a/config/alfresco/subsystems/thirdparty/imagemagick-transform.properties b/config/alfresco/subsystems/thirdparty/imagemagick-transform.properties new file mode 100644 index 0000000000..2eabb94b31 --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/imagemagick-transform.properties @@ -0,0 +1,4 @@ +# External executable locations +img.root=./ImageMagick +img.dyn=${img.root}/lib +img.exe=${img.root}/bin/convert diff --git a/config/alfresco/subsystems/thirdparty/openoffice-transform-context.xml b/config/alfresco/subsystems/thirdparty/openoffice-transform-context.xml new file mode 100644 index 0000000000..18d545cad7 --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/openoffice-transform-context.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + false + + + + + + + + + ${ooo.exe} + -accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager + -env:UserInstallation=file:///${ooo.user} + -nologo + -headless + -nofirststartwizard + -nocrashrep + -norestore + + + + + + false + + + 2 + + + + + + + + + + + false + + + + + + org.alfresco.util.OpenOfficeConnectionTester$OpenOfficeConnectionTesterJob + + + + + + + + + + + + + + + + + + + ${openOffice.test.cronExpression} + + + + + + + + + + + + + + + + + + + + + classpath:alfresco/mimetype/openoffice-document-formats.xml + + + + \ No newline at end of file diff --git a/config/alfresco/subsystems/thirdparty/openoffice-transform.properties b/config/alfresco/subsystems/thirdparty/openoffice-transform.properties new file mode 100644 index 0000000000..c2f8231010 --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/openoffice-transform.properties @@ -0,0 +1,3 @@ +# External executable locations +ooo.exe=soffice +ooo.user=${dir.root}/oouser diff --git a/config/alfresco/subsystems/thirdparty/swf-transform-context.xml b/config/alfresco/subsystems/thirdparty/swf-transform-context.xml new file mode 100644 index 0000000000..079ef42951 --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/swf-transform-context.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + ${swf.exe} -V + + + + + 1 + + + + + + + + + ${swf.exe} -T ${flashVersion} ${source} -o ${target} + + + + + + + + + + 1 + + + + + + + + application/pdf + + + application/x-shockwave-flash + + + + + + + diff --git a/config/alfresco/subsystems/thirdparty/swf-transform.properties b/config/alfresco/subsystems/thirdparty/swf-transform.properties new file mode 100644 index 0000000000..2ce7410472 --- /dev/null +++ b/config/alfresco/subsystems/thirdparty/swf-transform.properties @@ -0,0 +1,2 @@ +# External executable locations +swf.exe=./bin/pdf2swf diff --git a/config/alfresco/swf-transform-context.xml b/config/alfresco/swf-transform-context.xml index 355276020d..1524ae163a 100644 --- a/config/alfresco/swf-transform-context.xml +++ b/config/alfresco/swf-transform-context.xml @@ -3,49 +3,27 @@ - - - - - - - ${swf.exe} -V - - - - - 1 - - + + + + - - - - - - ${swf.exe} -T ${flashVersion} ${source} -o ${target} - - - - - - - - - - 1 - - + + transformer.worker.Pdf2swf - + - - application/pdf - application/x-shockwave-flash - + org.alfresco.repo.content.transform.ContentTransformerWorker - + + + + + + + colPropValue = (Collection)propValue; if (colPropValue.size() > 0) { @@ -461,7 +459,6 @@ public class RoutingContentService implements ContentService, ApplicationContext * @see org.alfresco.repo.content.transform.ContentTransformer * @deprecated */ - @SuppressWarnings("deprecation") public void transform(ContentReader reader, ContentWriter writer, Map options) throws NoTransformerException, ContentIOException { diff --git a/source/java/org/alfresco/repo/content/metadata/DefaultOpenOfficeMetadataWorker.java b/source/java/org/alfresco/repo/content/metadata/DefaultOpenOfficeMetadataWorker.java new file mode 100644 index 0000000000..84dd7921c2 --- /dev/null +++ b/source/java/org/alfresco/repo/content/metadata/DefaultOpenOfficeMetadataWorker.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2005-2009 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 received 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.metadata; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.Serializable; +import java.net.ConnectException; +import java.util.HashMap; +import java.util.Map; + +import net.sf.jooreports.openoffice.connection.OpenOfficeConnection; + +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.util.TempFileProvider; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.document.XDocumentInfoSupplier; +import com.sun.star.frame.XComponentLoader; +import com.sun.star.lang.XComponent; +import com.sun.star.ucb.XFileIdentifierConverter; +import com.sun.star.uno.UnoRuntime; + +/** + * The class doing the actual work of the OpenOfficeMetadataExtracter, based around an OpenOffice connection. + * + * @author dward + */ +public class DefaultOpenOfficeMetadataWorker implements OpenOfficeMetadataWorker +{ + private static final String KEY_AUTHOR = "author"; + private static final String KEY_TITLE = "title"; + private static final String KEY_DESCRIPTION = "description"; + + private OpenOfficeConnection connection; + private MimetypeService mimetypeService; + + public void setConnection(OpenOfficeConnection connection) + { + this.connection = connection; + } + + /* + * @param mimetypeService the mimetype service. Set this if required. + */ + public void setMimetypeService(MimetypeService mimetypeService) + { + this.mimetypeService = mimetypeService; + } + + /** + * @return Returns true if a connection to the Uno server could be established + */ + public boolean isConnected() + { + return connection.isConnected(); + } + + /* + * (non-Javadoc) + * @seeorg.alfresco.repo.content.metadata.OpenOfficeMetadataWorker#extractRaw(org.alfresco.service.cmr.repository. + * ContentReader) + */ + public Map extractRaw(ContentReader reader) throws Throwable + { + Map rawProperties = new HashMap(17); + + String sourceMimetype = reader.getMimetype(); + + // create temporary files to convert from and to + File tempFromFile = TempFileProvider.createTempFile("OpenOfficeMetadataExtracter-", "." + + this.mimetypeService.getExtension(sourceMimetype)); + + // download the content from the source reader + reader.getContent(tempFromFile); + + String sourceUrl = toUrl(tempFromFile, connection); + + // UNO Interprocess Bridge *should* be thread-safe, but... + XComponentLoader desktop = connection.getDesktop(); + XComponent document = desktop.loadComponentFromURL(sourceUrl, "_blank", 0, new PropertyValue[] + { + property("Hidden", Boolean.TRUE) + }); + if (document == null) + { + throw new FileNotFoundException("could not open source document: " + sourceUrl); + } + try + { + XDocumentInfoSupplier infoSupplier = (XDocumentInfoSupplier) UnoRuntime.queryInterface( + XDocumentInfoSupplier.class, document); + XPropertySet propSet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, infoSupplier + .getDocumentInfo()); + + rawProperties.put(KEY_TITLE, propSet.getPropertyValue("Title").toString()); + rawProperties.put(KEY_DESCRIPTION, propSet.getPropertyValue("Subject").toString()); + rawProperties.put(KEY_AUTHOR, propSet.getPropertyValue("Author").toString()); + } + finally + { + document.dispose(); + } + // Done + return rawProperties; + } + + public String toUrl(File file, OpenOfficeConnection connection) throws ConnectException + { + Object fcp = connection.getFileContentProvider(); + XFileIdentifierConverter fic = (XFileIdentifierConverter) UnoRuntime.queryInterface( + XFileIdentifierConverter.class, fcp); + return fic.getFileURLFromSystemPath("", file.getAbsolutePath()); + } + + private static PropertyValue property(String name, Object value) + { + PropertyValue property = new PropertyValue(); + property.Name = name; + property.Value = value; + return property; + } +} diff --git a/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracter.java b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracter.java index 1b3b438973..677282bf95 100644 --- a/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracter.java +++ b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracter.java @@ -22,28 +22,14 @@ * http://www.alfresco.com/legal/licensing" */ package org.alfresco.repo.content.metadata; -import java.io.File; -import java.io.FileNotFoundException; import java.io.Serializable; -import java.net.ConnectException; import java.util.Arrays; import java.util.HashSet; import java.util.Map; -import net.sf.jooreports.openoffice.connection.OpenOfficeConnection; - import org.alfresco.repo.content.MimetypeMap; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.util.PropertyCheck; -import org.alfresco.util.TempFileProvider; - -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.XPropertySet; -import com.sun.star.document.XDocumentInfoSupplier; -import com.sun.star.frame.XComponentLoader; -import com.sun.star.lang.XComponent; -import com.sun.star.ucb.XFileIdentifierConverter; -import com.sun.star.uno.UnoRuntime; /** * Extracts values from Star Office documents into the following: @@ -55,12 +41,8 @@ import com.sun.star.uno.UnoRuntime; * * @author Jesper Steen Møller */ -public class OpenOfficeMetadataExtracter extends AbstractMappingMetadataExtracter +public class OpenOfficeMetadataExtracter extends AbstractMappingMetadataExtracter implements OpenOfficeMetadataWorker { - private static final String KEY_AUTHOR = "author"; - private static final String KEY_TITLE = "title"; - private static final String KEY_DESCRIPTION = "description"; - public static String[] SUPPORTED_MIMETYPES = new String[] { MimetypeMap.MIMETYPE_STAROFFICE5_WRITER, MimetypeMap.MIMETYPE_STAROFFICE5_IMPRESS, @@ -68,16 +50,16 @@ public class OpenOfficeMetadataExtracter extends AbstractMappingMetadataExtracte MimetypeMap.MIMETYPE_OPENOFFICE1_IMPRESS }; - private OpenOfficeConnection connection; + private OpenOfficeMetadataWorker worker; public OpenOfficeMetadataExtracter() { super(new HashSet(Arrays.asList(SUPPORTED_MIMETYPES))); } - public void setConnection(OpenOfficeConnection connection) + public void setWorker(OpenOfficeMetadataWorker worker) { - this.connection = connection; + this.worker = worker; } /** @@ -86,19 +68,18 @@ public class OpenOfficeMetadataExtracter extends AbstractMappingMetadataExtracte @Override public synchronized void init() { - PropertyCheck.mandatory("OpenOfficeMetadataExtracter", "connection", connection); + PropertyCheck.mandatory("OpenOfficeMetadataExtracter", "worker", worker); // Base initialization super.init(); } - /** - * @return Returns true if a connection to the Uno server could be - * established + /* (non-Javadoc) + * @see org.alfresco.repo.content.metadata.OpenOfficeMetadataWorker#isConnected() */ public boolean isConnected() { - return connection.isConnected(); + return worker.isConnected(); } /** @@ -114,67 +95,18 @@ public class OpenOfficeMetadataExtracter extends AbstractMappingMetadataExtracte return super.isSupported(sourceMimetype); } + /* (non-Javadoc) + * @see org.alfresco.repo.content.metadata.OpenOfficeMetadataWorker#extractRaw(org.alfresco.service.cmr.repository.ContentReader) + */ @Override public Map extractRaw(ContentReader reader) throws Throwable { Map rawProperties = newRawMap(); - - String sourceMimetype = reader.getMimetype(); - - // create temporary files to convert from and to - File tempFromFile = TempFileProvider.createTempFile( - "OpenOfficeMetadataExtracter-", "." - + getMimetypeService().getExtension(sourceMimetype)); - // download the content from the source reader - reader.getContent(tempFromFile); - - String sourceUrl = toUrl(tempFromFile, connection); - - // UNO Interprocess Bridge *should* be thread-safe, but... - XComponentLoader desktop = connection.getDesktop(); - XComponent document = desktop.loadComponentFromURL( - sourceUrl, - "_blank", - 0, - new PropertyValue[] { property("Hidden", Boolean.TRUE) }); - if (document == null) + Map result = this.worker.extractRaw(reader); + for (Map.Entry entry : result.entrySet()) { - throw new FileNotFoundException("could not open source document: " + sourceUrl); + putRawValue(entry.getKey(), entry.getValue(), rawProperties); } - try - { - XDocumentInfoSupplier infoSupplier = (XDocumentInfoSupplier) UnoRuntime.queryInterface( - XDocumentInfoSupplier.class, document); - XPropertySet propSet = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, - infoSupplier - .getDocumentInfo()); - - putRawValue(KEY_TITLE, propSet.getPropertyValue("Title").toString(), rawProperties); - putRawValue(KEY_DESCRIPTION, propSet.getPropertyValue("Subject").toString(), rawProperties); - putRawValue(KEY_AUTHOR, propSet.getPropertyValue("Author").toString(), rawProperties); - } - finally - { - document.dispose(); - } - // Done return rawProperties; } - - public String toUrl(File file, OpenOfficeConnection connection) throws ConnectException - { - Object fcp = connection.getFileContentProvider(); - XFileIdentifierConverter fic = (XFileIdentifierConverter) UnoRuntime.queryInterface( - XFileIdentifierConverter.class, fcp); - return fic.getFileURLFromSystemPath("", file.getAbsolutePath()); - } - - private static PropertyValue property(String name, Object value) - { - PropertyValue property = new PropertyValue(); - property.Name = name; - property.Value = value; - return property; - } } diff --git a/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracterTest.java b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracterTest.java index 315bd6d749..002a88171d 100644 --- a/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracterTest.java +++ b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataExtracterTest.java @@ -41,7 +41,10 @@ public class OpenOfficeMetadataExtracterTest extends AbstractMetadataExtracterTe extracter = new OpenOfficeMetadataExtracter(); extracter.setMimetypeService(mimetypeMap); extracter.setDictionaryService(dictionaryService); - extracter.setConnection(connection); + DefaultOpenOfficeMetadataWorker worker = new DefaultOpenOfficeMetadataWorker(); + worker.setConnection(connection); + worker.setMimetypeService(mimetypeMap); + extracter.setWorker(worker); extracter.init(); } diff --git a/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataWorker.java b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataWorker.java new file mode 100644 index 0000000000..bac7573616 --- /dev/null +++ b/source/java/org/alfresco/repo/content/metadata/OpenOfficeMetadataWorker.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2005-2009 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 received 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.metadata; + +import java.io.Serializable; +import java.util.Map; + +import org.alfresco.service.cmr.repository.ContentReader; + +/** + * An interface that allows separation between the metadata extractor registry and the third party subsystem owning the + * open office connection. + * + * @author dward + */ +public interface OpenOfficeMetadataWorker +{ + /** + * @return Returns true if a connection to the Uno server could be established + */ + public boolean isConnected(); + + public Map extractRaw(ContentReader reader) throws Throwable; +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer2.java b/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer2.java index 36a45b24b1..5f1a8aaa4b 100644 --- a/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer2.java +++ b/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer2.java @@ -24,16 +24,12 @@ */ package org.alfresco.repo.content.transform; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.service.cmr.repository.ContentAccessor; import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; -import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.TransformationOptions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -48,13 +44,11 @@ import org.apache.commons.logging.LogFactory; * @author Derek Hulley * @author Roy Wetherall */ -public abstract class AbstractContentTransformer2 implements ContentTransformer +public abstract class AbstractContentTransformer2 extends ContentTransformerHelper implements ContentTransformer { private static final Log logger = LogFactory.getLog(AbstractContentTransformer2.class); - private MimetypeService mimetypeService; private ContentTransformerRegistry registry; - private List explicitTransformations; private double averageTime = 0.0; private long count = 0L; @@ -64,7 +58,6 @@ public abstract class AbstractContentTransformer2 implements ContentTransformer protected AbstractContentTransformer2() { averageTime = 0.0; - explicitTransformations = new ArrayList(0); } /** @@ -75,31 +68,7 @@ public abstract class AbstractContentTransformer2 implements ContentTransformer public void setRegistry(ContentTransformerRegistry registry) { this.registry = registry; - } - - /** - * Helper setter of the mimetype service. This is not always required. - * - * @param mimetypeService - */ - public void setMimetypeService(MimetypeService mimetypeService) - { - this.mimetypeService = mimetypeService; - } - - /** - * @return Returns the mimetype helper - */ - protected MimetypeService getMimetypeService() - { - return mimetypeService; - } - - public void setExplicitTransformations(List explicitTransformations) - { - this.explicitTransformations = explicitTransformations; - } - + } @Override public String toString() @@ -128,24 +97,6 @@ public abstract class AbstractContentTransformer2 implements ContentTransformer registry.addTransformer(this); } - /** - * Convenience to fetch and check the mimetype for the given content - * - * @param content the reader/writer for the content - * @return Returns the mimetype for the content - * @throws AlfrescoRuntimeException if the content doesn't have a mimetype - */ - protected String getMimetype(ContentAccessor content) - { - String mimetype = content.getMimetype(); - if (mimetype == null) - { - throw new AlfrescoRuntimeException("Mimetype is mandatory for transformation: " + content); - } - // done - return mimetype; - } - /** * Convenience method to check the transformability of a transformation * @@ -270,26 +221,6 @@ public abstract class AbstractContentTransformer2 implements ContentTransformer this.transform(reader, writer, new TransformationOptions(options)); } - /** - * Default implementation, override if need to extend logic - * - * @see org.alfresco.repo.content.transform.ContentTransformer#isExplicitTransformation(java.lang.String, java.lang.String, org.alfresco.service.cmr.repository.TransformationOptions) - */ - public boolean isExplicitTransformation(String sourceMimetype, String targetMimetype, TransformationOptions options) - { - boolean result = false; - for (ExplictTransformationDetails explicitTransformation : this.explicitTransformations) - { - if (sourceMimetype.equals(explicitTransformation.getSourceMimetype()) == true && - targetMimetype.equals(explicitTransformation.getTargetMimetype()) == true) - { - result = true; - break; - } - } - return result; - } - /** * @return Returns the calculated running average of the current transformations */ diff --git a/source/java/org/alfresco/repo/content/transform/ContentTransformerHelper.java b/source/java/org/alfresco/repo/content/transform/ContentTransformerHelper.java new file mode 100644 index 0000000000..2c150e85a9 --- /dev/null +++ b/source/java/org/alfresco/repo/content/transform/ContentTransformerHelper.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2005-2009 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 received 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.transform; + +import java.util.Collections; +import java.util.List; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.service.cmr.repository.ContentAccessor; +import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.service.cmr.repository.TransformationOptions; + +/** + * A class providing basic functionality shared by both {@link ContentTransformer}s and {@link ContentTransformerWorker} + * s. + * + * @author dward + */ +public class ContentTransformerHelper +{ + + private MimetypeService mimetypeService; + private List explicitTransformations; + + /** + * + */ + public ContentTransformerHelper() + { + setExplicitTransformations(Collections. emptyList()); + } + + /** + * Helper setter of the mimetype service. This is not always required. + * + * @param mimetypeService + */ + public void setMimetypeService(MimetypeService mimetypeService) + { + this.mimetypeService = mimetypeService; + } + + /** + * @return Returns the mimetype helper + */ + protected MimetypeService getMimetypeService() + { + return mimetypeService; + } + + public void setExplicitTransformations(List explicitTransformations) + { + this.explicitTransformations = explicitTransformations; + } + + /** + * Convenience to fetch and check the mimetype for the given content + * + * @param content + * the reader/writer for the content + * @return Returns the mimetype for the content + * @throws AlfrescoRuntimeException + * if the content doesn't have a mimetype + */ + protected String getMimetype(ContentAccessor content) + { + String mimetype = content.getMimetype(); + if (mimetype == null) + { + throw new AlfrescoRuntimeException("Mimetype is mandatory for transformation: " + content); + } + // done + return mimetype; + } + + /** + * Default implementation, override if need to extend logic + * + * @see org.alfresco.repo.content.transform.ContentTransformer#isExplicitTransformation(java.lang.String, + * java.lang.String, org.alfresco.service.cmr.repository.TransformationOptions) + */ + public boolean isExplicitTransformation(String sourceMimetype, String targetMimetype, TransformationOptions options) + { + boolean result = false; + for (ExplictTransformationDetails explicitTransformation : this.explicitTransformations) + { + if (sourceMimetype.equals(explicitTransformation.getSourceMimetype()) == true + && targetMimetype.equals(explicitTransformation.getTargetMimetype()) == true) + { + result = true; + break; + } + } + return result; + } + +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/content/transform/ContentTransformerWorker.java b/source/java/org/alfresco/repo/content/transform/ContentTransformerWorker.java new file mode 100644 index 0000000000..de37d286ee --- /dev/null +++ b/source/java/org/alfresco/repo/content/transform/ContentTransformerWorker.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2009 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 received 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.transform; + +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.TransformationOptions; + +/** + * An interface that allows separation between the content transformer registry and the various third party subsystems + * performing the transformation. + * + * @author dward + */ +public interface ContentTransformerWorker +{ + /** + * Checks if this worker is available. + * + * @return true if it is available + */ + public boolean isAvailable(); + + /** + * Gets a string returning product and version information. + * + * @return the version string + */ + public String getVersionString(); + + public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options); + + public void transform(ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception; +} diff --git a/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java index b54647f6a1..7ebbf5bed5 100644 --- a/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java +++ b/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerTest.java @@ -37,7 +37,7 @@ import org.alfresco.service.cmr.repository.TransformationOptions; import org.alfresco.util.TempFileProvider; /** - * @see org.alfresco.repo.content.transform.OpenOfficeContentTransformer + * @see org.alfresco.repo.content.transform.OpenOfficeContentTransformerWorker * * @author Derek Hulley */ @@ -45,7 +45,8 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer { private static String MIMETYPE_RUBBISH = "text/rubbish"; - private OpenOfficeContentTransformer transformer; + private OpenOfficeContentTransformerWorker worker; + private ContentTransformer transformer; @Override public void setUp() throws Exception @@ -54,11 +55,15 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer OpenOfficeConnection connection = (OpenOfficeConnection) ctx.getBean("openOfficeConnection"); - transformer = new OpenOfficeContentTransformer(); + this.worker = new OpenOfficeContentTransformerWorker(); + worker.setMimetypeService(mimetypeService); + worker.setConnection(connection); + worker.setDocumentFormatsConfiguration("classpath:alfresco/mimetype/openoffice-document-formats.xml"); + worker.afterPropertiesSet(); + ProxyContentTransformer transformer = new ProxyContentTransformer(); transformer.setMimetypeService(mimetypeService); - transformer.setConnection(connection); - transformer.setDocumentFormatsConfiguration("classpath:alfresco/mimetype/openoffice-document-formats.xml"); - transformer.register(); + transformer.setWorker(worker); + this.transformer = transformer; } /** @@ -77,7 +82,7 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer public void testReliability() throws Exception { - if (!transformer.isConnected()) + if (!worker.isAvailable()) { // no connection return; @@ -99,7 +104,7 @@ public class OpenOfficeContentTransformerTest extends AbstractContentTransformer */ public void testHtmlToPdf() throws Exception { - if (!transformer.isConnected()) + if (!worker.isAvailable()) { // no connection return; diff --git a/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformer.java b/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerWorker.java similarity index 66% rename from source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformer.java rename to source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerWorker.java index f29af61c96..5b9a19d0e1 100644 --- a/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/OpenOfficeContentTransformerWorker.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Alfresco Software Limited. + * Copyright (C) 2005-2009 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 @@ -18,7 +18,7 @@ * 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 + * FLOSS exception. You should have received a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ @@ -46,27 +46,25 @@ import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.TransformationOptions; import org.alfresco.util.PropertyCheck; import org.alfresco.util.TempFileProvider; +import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.DefaultResourceLoader; /** - * Makes use of the {@link http://sourceforge.net/projects/joott/ JOOConverter} library to - * perform OpenOffice-drive conversions. + * Makes use of the {@link http://sourceforge.net/projects/joott/JOOConverter} library to perform OpenOffice-drive + * conversions. * * @author Derek Hulley */ -public class OpenOfficeContentTransformer extends AbstractContentTransformer2 +public class OpenOfficeContentTransformerWorker extends ContentTransformerHelper implements ContentTransformerWorker, InitializingBean { private OpenOfficeConnection connection; private AbstractOpenOfficeDocumentConverter converter; private String documentFormatsConfiguration; private DocumentFormatRegistry formatRegistry; - - public OpenOfficeContentTransformer() - { - } - + /** - * @param connection the connection that the converter uses + * @param connection + * the connection that the converter uses */ public void setConnection(OpenOfficeConnection connection) { @@ -74,12 +72,13 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 } /** - * Explicitly set the converter to be used. The converter must use the same connection - * set in {@link #setConnection(OpenOfficeConnection)}. + * Explicitly set the converter to be used. The converter must use the same connection set in + * {@link #setConnection(OpenOfficeConnection)}. *

* If not set, then the OpenOfficeDocumentConverter will be used. * - * @param converter the converter to use. + * @param converter + * the converter to use. */ public void setConverter(AbstractOpenOfficeDocumentConverter converter) { @@ -89,51 +88,48 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 /** * Set a non-default location from which to load the document format mappings. * - * @param path a resource location supporting the file: or classpath: prefixes + * @param path + * a resource location supporting the file: or classpath: prefixes */ public void setDocumentFormatsConfiguration(String path) { this.documentFormatsConfiguration = path; } - public boolean isConnected() + public boolean isAvailable() { - return connection.isConnected(); + return this.connection.isConnected(); } - @Override - public void register() + public void afterPropertiesSet() throws Exception { - PropertyCheck.mandatory("OpenOfficeContentTransformer", "connection", connection); - + PropertyCheck.mandatory("OpenOfficeContentTransformerWorker", "connection", this.connection); + // load the document conversion configuration - if (documentFormatsConfiguration != null) + if (this.documentFormatsConfiguration != null) { DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); try { - InputStream is = resourceLoader.getResource(documentFormatsConfiguration).getInputStream(); - formatRegistry = new XmlDocumentFormatRegistry(is); + InputStream is = resourceLoader.getResource(this.documentFormatsConfiguration).getInputStream(); + this.formatRegistry = new XmlDocumentFormatRegistry(is); } catch (IOException e) { - throw new AlfrescoRuntimeException( - "Unable to load document formats configuration file: " + documentFormatsConfiguration); + throw new AlfrescoRuntimeException("Unable to load document formats configuration file: " + + this.documentFormatsConfiguration); } } else { - formatRegistry = new XmlDocumentFormatRegistry(); + this.formatRegistry = new XmlDocumentFormatRegistry(); } - + // set up the converter - if (converter == null) + if (this.converter == null) { - converter = new OpenOfficeDocumentConverter(connection); + this.converter = new OpenOfficeDocumentConverter(this.connection); } - - // Register - super.register(); } /** @@ -141,12 +137,12 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 */ public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options) { - if (!isConnected()) + if (!isAvailable()) { // The connection management is must take care of this return false; } - + // there are some conversions that fail, despite the converter believing them possible if (targetMimetype.equals(MimetypeMap.MIMETYPE_XHTML)) { @@ -160,19 +156,19 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 { return false; } - + MimetypeService mimetypeService = getMimetypeService(); String sourceExtension = mimetypeService.getExtension(sourceMimetype); String targetExtension = mimetypeService.getExtension(targetMimetype); // query the registry for the source format - DocumentFormat sourceFormat = formatRegistry.getFormatByFileExtension(sourceExtension); + DocumentFormat sourceFormat = this.formatRegistry.getFormatByFileExtension(sourceExtension); if (sourceFormat == null) { // no document format return false; } // query the registry for the target format - DocumentFormat targetFormat = formatRegistry.getFormatByFileExtension(targetExtension); + DocumentFormat targetFormat = this.formatRegistry.getFormatByFileExtension(targetExtension); if (targetFormat == null) { // no document format @@ -193,10 +189,7 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 } } - protected void transformInternal( - ContentReader reader, - ContentWriter writer, - TransformationOptions options) throws Exception + public void transform(ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception { String sourceMimetype = getMimetype(reader); String targetMimetype = getMimetype(writer); @@ -205,14 +198,14 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 String sourceExtension = mimetypeService.getExtension(sourceMimetype); String targetExtension = mimetypeService.getExtension(targetMimetype); // query the registry for the source format - DocumentFormat sourceFormat = formatRegistry.getFormatByFileExtension(sourceExtension); + DocumentFormat sourceFormat = this.formatRegistry.getFormatByFileExtension(sourceExtension); if (sourceFormat == null) { // source format is not recognised throw new ContentIOException("No OpenOffice document format for source extension: " + sourceExtension); } // query the registry for the target format - DocumentFormat targetFormat = formatRegistry.getFormatByFileExtension(targetExtension); + DocumentFormat targetFormat = this.formatRegistry.getFormatByFileExtension(targetExtension); if (targetFormat == null) { // target format is not recognised @@ -223,38 +216,41 @@ public class OpenOfficeContentTransformer extends AbstractContentTransformer2 // does the format support the conversion if (!targetFormat.isExportableFrom(sourceFamily)) { - throw new ContentIOException( - "OpenOffice conversion not supported: \n" + - " reader: " + reader + "\n" + - " writer: " + writer); + throw new ContentIOException("OpenOffice conversion not supported: \n" + " reader: " + reader + "\n" + + " writer: " + writer); } // create temporary files to convert from and to - File tempFromFile = TempFileProvider.createTempFile( - "OpenOfficeContentTransformer-source-", - "." + sourceExtension); - File tempToFile = TempFileProvider.createTempFile( - "OpenOfficeContentTransformer-target-", - "." + targetExtension); + File tempFromFile = TempFileProvider.createTempFile("OpenOfficeContentTransformer-source-", "." + + sourceExtension); + File tempToFile = TempFileProvider + .createTempFile("OpenOfficeContentTransformer-target-", "." + targetExtension); // download the content from the source reader reader.getContent(tempFromFile); - + try { - converter.convert(tempFromFile, sourceFormat, tempToFile, targetFormat); + this.converter.convert(tempFromFile, sourceFormat, tempToFile, targetFormat); // conversion success } catch (OpenOfficeException e) { - throw new ContentIOException("OpenOffice server conversion failed: \n" + - " reader: " + reader + "\n" + - " writer: " + writer + "\n" + - " from file: " + tempFromFile + "\n" + - " to file: " + tempToFile, - e); + throw new ContentIOException("OpenOffice server conversion failed: \n" + " reader: " + reader + "\n" + + " writer: " + writer + "\n" + " from file: " + tempFromFile + "\n" + " to file: " + + tempToFile, e); } - + // upload the temp output to the writer given us writer.putContent(tempToFile); } + + /* + * (non-Javadoc) + * @see org.alfresco.repo.content.transform.ContentTransformerWorker#getVersionString() + */ + public String getVersionString() + { + // Actual version information owned by OpenOfficeConnectionTester + return ""; + } } diff --git a/source/java/org/alfresco/repo/content/transform/ProxyContentTransformer.java b/source/java/org/alfresco/repo/content/transform/ProxyContentTransformer.java new file mode 100644 index 0000000000..f821d22112 --- /dev/null +++ b/source/java/org/alfresco/repo/content/transform/ProxyContentTransformer.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2005-2009 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 received 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.transform; + +import net.sf.jooreports.converter.DocumentFormatRegistry; + +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.TransformationOptions; + +/** + * Makes use of a {@link ContentTransformerWorker} to perform conversions. + * + * @author dward + */ +public class ProxyContentTransformer extends AbstractContentTransformer2 +{ + private ContentTransformerWorker worker; + + public ProxyContentTransformer() + { + } + + /** + * @param worker + * the worker that the converter uses + */ + public void setWorker(ContentTransformerWorker worker) + { + this.worker = worker; + } + + /** + * @see DocumentFormatRegistry + */ + public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options) + { + return this.worker.isTransformable(sourceMimetype, targetMimetype, options); + } + + protected void transformInternal(ContentReader reader, ContentWriter writer, TransformationOptions options) + throws Exception + { + this.worker.transform(reader, writer, options); + } +} diff --git a/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerTest.java index 86a8ef3f3c..b02588a121 100644 --- a/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerTest.java +++ b/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerTest.java @@ -39,20 +39,20 @@ import org.alfresco.util.TempFileProvider; import org.alfresco.util.exec.RuntimeExec; /** - * @see org.alfresco.repo.content.transform.RuntimeExecutableContentTransformer + * @see org.alfresco.repo.content.transform.RuntimeExecutableContentTransformerWorker * * @author Derek Hulley */ public class RuntimeExecutableContentTransformerTest extends BaseAlfrescoTestCase { - private RuntimeExecutableContentTransformer transformer; + private ContentTransformer transformer; @Override protected void setUp() throws Exception { super.setUp(); - transformer = new RuntimeExecutableContentTransformer(); + RuntimeExecutableContentTransformerWorker worker = new RuntimeExecutableContentTransformerWorker(); // the command to execute RuntimeExec transformCommand = new RuntimeExec(); Map commandMap = new HashMap(5); @@ -61,16 +61,21 @@ public class RuntimeExecutableContentTransformerTest extends BaseAlfrescoTestCas commandMap.put(".*", "cmd /c copy /Y \"${source}\" \"${target}\""); transformCommand.setCommandMap(commandMap); transformCommand.setErrorCodes("1, 2"); - transformer.setTransformCommand(transformCommand); - transformer.setMimetypeService(serviceRegistry.getMimetypeService()); + worker.setTransformCommand(transformCommand); + worker.setMimetypeService(serviceRegistry.getMimetypeService()); // set the explicit transformations List explicitTranformations = new ArrayList(1); explicitTranformations.add( new ExplictTransformationDetails(MimetypeMap.MIMETYPE_TEXT_PLAIN, MimetypeMap.MIMETYPE_XML)); - transformer.setExplicitTransformations(explicitTranformations); + worker.setExplicitTransformations(explicitTranformations); // initialise so that it doesn't score 0 - transformer.register(); + worker.afterPropertiesSet(); + + ProxyContentTransformer transformer = new ProxyContentTransformer(); + transformer.setMimetypeService(serviceRegistry.getMimetypeService()); + transformer.setWorker(worker); + this.transformer = transformer; } public void testCopyCommand() throws Exception diff --git a/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformer.java b/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerWorker.java similarity index 96% rename from source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformer.java rename to source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerWorker.java index 1b3787dd1e..b4712d2dfb 100644 --- a/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/RuntimeExecutableContentTransformerWorker.java @@ -39,6 +39,7 @@ import org.alfresco.util.exec.RuntimeExec; import org.alfresco.util.exec.RuntimeExec.ExecutionResult; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; /** * This configurable wrapper is able to execute any command line transformation that @@ -67,12 +68,12 @@ import org.apache.commons.logging.LogFactory; * @since 1.1 * @author Derek Hulley */ -public class RuntimeExecutableContentTransformer extends AbstractContentTransformer2 +public class RuntimeExecutableContentTransformerWorker extends ContentTransformerHelper implements ContentTransformerWorker, InitializingBean { public static final String VAR_SOURCE = "source"; public static final String VAR_TARGET = "target"; - private static Log logger = LogFactory.getLog(RuntimeExecutableContentTransformer.class); + private static Log logger = LogFactory.getLog(RuntimeExecutableContentTransformerWorker.class); private boolean available; private RuntimeExec checkCommand; @@ -81,7 +82,7 @@ public class RuntimeExecutableContentTransformer extends AbstractContentTransfor /** Stores the output from the check command */ private String versionString; - public RuntimeExecutableContentTransformer() + public RuntimeExecutableContentTransformerWorker() { } @@ -130,13 +131,13 @@ public class RuntimeExecutableContentTransformer extends AbstractContentTransfor throw new AlfrescoRuntimeException("content.runtime_exec.property_moved"); } + /** * Executes the check command, if present. Any errors will result in this component * being rendered unusable within the transformer registry, but may still be called * directly. */ - @Override - public void register() + public void afterPropertiesSet() { if (transformCommand == null) { @@ -162,8 +163,6 @@ public class RuntimeExecutableContentTransformer extends AbstractContentTransfor // no check - just assume it is available available = true; } - // call the base class to make sure that it gets registered - super.register(); } /** @@ -181,7 +180,7 @@ public class RuntimeExecutableContentTransformer extends AbstractContentTransfor return false; } - if (isExplicitTransformation(sourceMimetype, targetMimetype, options) == true) + if (isExplicitTransformation(sourceMimetype, targetMimetype, options)) { return true; } @@ -217,7 +216,7 @@ public class RuntimeExecutableContentTransformer extends AbstractContentTransfor * * @see #transformInternal(File, File) */ - protected final void transformInternal( + public final void transform( ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception diff --git a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java similarity index 85% rename from source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java rename to source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java index 66fd2f6cb4..4aab440be8 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Alfresco Software Limited. + * Copyright (C) 2005-2009 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 @@ -18,7 +18,7 @@ * 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 + * FLOSS exception. You should have received a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ @@ -30,30 +30,33 @@ import java.io.InputStream; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.filestore.FileContentWriter; -import org.alfresco.repo.content.transform.AbstractContentTransformer2; +import org.alfresco.repo.content.transform.ContentTransformerHelper; +import org.alfresco.repo.content.transform.ContentTransformerWorker; import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.TransformationOptions; import org.alfresco.util.TempFileProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; /** * Abstract helper for transformations based on ImageMagick * * @author Derek Hulley */ -public abstract class AbstractImageMagickContentTransformer extends AbstractContentTransformer2 +public abstract class AbstractImageMagickContentTransformerWorker extends ContentTransformerHelper implements ContentTransformerWorker, InitializingBean { /** the prefix for mimetypes supported by the transformer */ public static final String MIMETYPE_IMAGE_PREFIX = "image/"; - private static final Log logger = LogFactory.getLog(AbstractImageMagickContentTransformer.class); + private static final Log logger = LogFactory.getLog(AbstractImageMagickContentTransformerWorker.class); private boolean available; - public AbstractImageMagickContentTransformer() + public AbstractImageMagickContentTransformerWorker() { this.available = false; } @@ -82,7 +85,7 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont *

* If initialization is successful, then autoregistration takes place. */ - public void init() + public void afterPropertiesSet() { if (getMimetypeService() == null) { @@ -120,10 +123,7 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont " to: " + outputFile); } // we can be sure that it works - setAvailable(true); - - // register - super.register(); + setAvailable(true); } catch (Throwable e) { @@ -171,8 +171,8 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont { return false; } - if (!AbstractImageMagickContentTransformer.isSupported(sourceMimetype) || - !AbstractImageMagickContentTransformer.isSupported(targetMimetype)) + if (!AbstractImageMagickContentTransformerWorker.isSupported(sourceMimetype) || + !AbstractImageMagickContentTransformerWorker.isSupported(targetMimetype)) { // only support IMAGE -> IMAGE (excl. RGB) return false; @@ -186,7 +186,7 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont /** * @see #transformInternal(File, File) */ - protected final void transformInternal( + public final void transform( ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception @@ -196,8 +196,9 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont String targetMimetype = getMimetype(writer); // get the extensions to use - String sourceExtension = getMimetypeService().getExtension(sourceMimetype); - String targetExtension = getMimetypeService().getExtension(targetMimetype); + MimetypeService mimetypeService = getMimetypeService(); + String sourceExtension = mimetypeService.getExtension(sourceMimetype); + String targetExtension = mimetypeService.getExtension(targetMimetype); if (sourceExtension == null || targetExtension == null) { throw new AlfrescoRuntimeException("Unknown extensions for mimetypes: \n" + diff --git a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java index 4017d0c646..ab508a2ec7 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java +++ b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java @@ -29,6 +29,7 @@ import java.util.Collections; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.content.transform.ContentTransformer; +import org.alfresco.repo.content.transform.ProxyContentTransformer; import org.alfresco.service.cmr.repository.TransformationOptions; import org.alfresco.util.exec.RuntimeExec; @@ -39,7 +40,8 @@ import org.alfresco.util.exec.RuntimeExec; */ public class ImageMagickContentTransformerTest extends AbstractContentTransformerTest { - private ImageMagickContentTransformer transformer; + private ImageMagickContentTransformerWorker worker; + private ContentTransformer transformer; @Override public void setUp() throws Exception @@ -50,10 +52,15 @@ public class ImageMagickContentTransformerTest extends AbstractContentTransforme executer.setCommand(new String[] {"imconvert.exe", "${source}", "${options}", "${target}"}); executer.setDefaultProperties(Collections.singletonMap("options", "")); - transformer = new ImageMagickContentTransformer(); + this.worker = new ImageMagickContentTransformerWorker(); + worker.setMimetypeService(mimetypeService); + worker.setExecuter(executer); + worker.afterPropertiesSet(); + + ProxyContentTransformer transformer = new ProxyContentTransformer(); transformer.setMimetypeService(mimetypeService); - transformer.setExecuter(executer); - transformer.init(); + this.transformer = transformer; + } /** @@ -66,7 +73,7 @@ public class ImageMagickContentTransformerTest extends AbstractContentTransforme public void testReliability() throws Exception { - if (!transformer.isAvailable()) + if (!this.worker.isAvailable()) { return; } diff --git a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformer.java b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerWorker.java similarity index 90% rename from source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformer.java rename to source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerWorker.java index 8f815a9af4..86239d573c 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerWorker.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2008 Alfresco Software Limited. + * Copyright (C) 2005-2009 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 @@ -41,7 +41,7 @@ import org.apache.commons.logging.LogFactory; * * @author Derek Hulley */ -public class ImageMagickContentTransformer extends AbstractImageMagickContentTransformer +public class ImageMagickContentTransformerWorker extends AbstractImageMagickContentTransformerWorker { /** options variable name */ private static final String KEY_OPTIONS = "options"; @@ -50,7 +50,7 @@ public class ImageMagickContentTransformer extends AbstractImageMagickContentTra /** target variable name */ private static final String VAR_TARGET = "target"; - private static final Log logger = LogFactory.getLog(ImageMagickContentTransformer.class); + private static final Log logger = LogFactory.getLog(ImageMagickContentTransformerWorker.class); /** the system command executer */ private RuntimeExec executer; @@ -64,7 +64,7 @@ public class ImageMagickContentTransformer extends AbstractImageMagickContentTra /** * Default constructor */ - public ImageMagickContentTransformer() + public ImageMagickContentTransformerWorker() { } @@ -110,31 +110,28 @@ public class ImageMagickContentTransformer extends AbstractImageMagickContentTra return this.versionString; } + /** * Checks for the JMagick and ImageMagick dependencies, using the common * {@link #transformInternal(File, File) transformation method} to check * that the sample image can be converted. */ - public void init() + @Override + public void afterPropertiesSet() { if (executer == null) { throw new AlfrescoRuntimeException("System runtime executer not set"); } - super.init(); + super.afterPropertiesSet(); if (isAvailable()) { try { + // On some platforms / versions, the -version command seems to return an error code whilst still + // returning output, so let's not worry about the exit code! ExecutionResult result = this.checkCommand.execute(); - if (result.getSuccess()) - { - this.versionString = result.getStdOut().trim(); - } - else - { - setAvailable(false); - } + this.versionString = result.getStdOut().trim(); } catch (Throwable e) { diff --git a/source/java/org/alfresco/repo/management/DefaultManagedApplicationContextFactory.java b/source/java/org/alfresco/repo/management/DefaultManagedApplicationContextFactory.java index 564304446f..5160aba694 100644 --- a/source/java/org/alfresco/repo/management/DefaultManagedApplicationContextFactory.java +++ b/source/java/org/alfresco/repo/management/DefaultManagedApplicationContextFactory.java @@ -129,16 +129,19 @@ public class DefaultManagedApplicationContextFactory extends AbstractLifecycleBe { "classpath*:alfresco/subsystems/" + this.beanName + "/*-context.xml" }, false, this.parent); - // Add all the post processors of the parent, e.g. to make sure system placeholders get expanded properly - for (Object postProcessor : this.parent.getBeansOfType(BeanFactoryPostProcessor.class).values()) - { - this.applicationContext.addBeanFactoryPostProcessor((BeanFactoryPostProcessor) postProcessor); - } + // Add a property placeholder configurer, with the subsystem-scoped default properties PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); configurer.setProperties(this.properties); configurer.setIgnoreUnresolvablePlaceholders(true); this.applicationContext.addBeanFactoryPostProcessor(configurer); + + // Add all the post processors of the parent, e.g. to make sure system placeholders get expanded properly + for (Object postProcessor : this.parent.getBeansOfType(BeanFactoryPostProcessor.class).values()) + { + this.applicationContext.addBeanFactoryPostProcessor((BeanFactoryPostProcessor) postProcessor); + } + this.applicationContext.setClassLoader(parent.getClassLoader()); this.applicationContext.refresh(); } diff --git a/source/java/org/alfresco/repo/management/ManagedSubsystemProxyFactory.java b/source/java/org/alfresco/repo/management/ManagedSubsystemProxyFactory.java index eaac874c43..d950b7d08b 100644 --- a/source/java/org/alfresco/repo/management/ManagedSubsystemProxyFactory.java +++ b/source/java/org/alfresco/repo/management/ManagedSubsystemProxyFactory.java @@ -87,6 +87,16 @@ public class ManagedSubsystemProxyFactory extends ProxyFactoryBean })); } + @SuppressWarnings("unchecked") + @Override + public void setInterfaces(Class[] interfaces) + { + super.setInterfaces(interfaces); + // Make it possible to export the object via JMX + setTargetClass(getObjectType()); + } + + /** * Sets the source application context factory. *