Folks,
I have recently started working on the Opencast Matterhorn project which
involves capturing, trans-coding and distribution of digital video files.
One of the services we distribute to is YouTube. As I understand it,
the Matterhorn module that does this worked fine in Felix 3 but now
fails in Felix 4.
We are running the application with Java 1.6.
The stack trace for this error:
17:08:44 WARN (YoutubeDistributionService:418) - Error distributing
http://localhost:8080/files/mediapackage/a78f4054-9b79-4d87-b938-08547d495a9d/49a4dfe4-91bf-4450-b186-e0d8f24a53cd/test3.mp4
javax.activation.UnsupportedDataTypeException: application/atom+xml
at javax.activation.DataHandler.writeTo(DataHandler.java:75)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:452)
at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:157)
at
com.google.gdata.wireformats.output.media.MediaMultipartGenerator.generate(MediaMultipartGenerator.java:58)
at
com.google.gdata.wireformats.output.media.MediaMultipartGenerator.generate(MediaMultipartGenerator.java:37)
at com.google.gdata.client.Service.writeRequestData(Service.java:2071)
at
com.google.gdata.client.media.MediaService.insert(MediaService.java:398)
at
org.opencastproject.distribution.youtube.YoutubeDistributionService.distribute(YoutubeDistributionService.java:344)
.......................
Obviously the google gdata code, specifically gdata-media, is in play
here along with javax.mail and javax.activation.
In the Felix 4 context we are using the following javax.mail and
javax.activation bundles from Geronimo
geronimo-activation_1.1_spec-1.1.jar and
geronimo-javamail_1.4_mail-1.8.3.jar
Googling for this error, I found the following thread that discusses a
problem that seems closely analogous to our problem,
http://forum.springsource.org/archive/index.php/t-69180.html
The container in that discussion is the Spring dm Server but the error
and likely cause seem relevant. See especially the posting on Mar 21st,
2009 by oleg.zhurakousky.
Note particularly that the root cause is likely not an
UnsupportedDataTypeException but a ClassNotFoundException for one of the
classes in com.sun.mail.handlers that becomes the
UnsupportedDataTypeException. Quoting the thread " This results in the
DataContentHandler for your MIME type being null which is the root of
your exception. "
I have tried explicitly importing the Geronimo javax.mail and
javax.activation bundles using <Import-Bundle> and <Embed-Dependency> as
an analogous fix to that in the Spring thread but that doesn't fix our
problem. I've tried several other javax.mail and javax.activation
bundles e.g. from Spring but with no luck. Manipulating the
ClassLoaders as discussed there doesn't seem possible as the error is
being generated in the gdata code and, in any event, that approach seems
evil.
Any pointers or suggestions are most welcome. For example, should I
explicitly import com.sun.mail.handlers.* even though neither our code
nor the gdata code calls them directly? That also seems evil to me.
I've looked at all the imports in the system/console/bundles UI for our
bundle and the Geronimo bundles and everything appears consistent namely
that our YouTube bundle is importing the javax.mail packages from the
Geronimo bundle. Also the Geronimo mail bundle is importing
javax.activation bundle from the Geronimo mail bundle.
Relevant sections of the Felix 4 config for our app are:
# Packages 'javax.xml.stream, javax.xml.stream.events,
javax.xml.stream.util' removed --> provided by ServiceMix STAX bundle
# Packages 'javax.mail, javax.mail.internet' removed --> provided by
Geronimo JavaMail bundle
org.osgi.framework.system.packages=org.osgi.framework;version=1.6.0,org.osgi.framework.hooks.bundle;version=1.0.0,org.osgi.framework.hooks.resolver;version=1.0.0,org.osgi.framework.hooks.service;version=1.1.0,org.osgi.framework.hooks.weaving;version=1.0.0,org.osgi.framework.launch;version=1.0.0,org.osgi.framework.startlevel;version=1.0.0,org.osgi.framework.wiring;version=1.0.0,org.osgi.service.packageadmin;version=1.2.0,org.osgi.service.startlevel;version=1.1.0,org.osgi.service.url;version=1.0.0,org.osgi.util.tracker;version=1.5.0,javax.accessibility,
javax.activity, javax.annotation, javax.annotation.processing,
javax.crypto, javax.crypto.interfaces, javax.crypto.spec, javax.imageio,
javax.imageio.event, javax.imageio.metadata, javax.imageio.plugins.bmp,
javax.imageio.plugins.jpeg, javax.imageio.spi, javax.imageio.stream,
javax.jws, javax.jws.soap, javax.lang.model, javax.lang.model.element,
javax.lang.model.type, javax.lang.model.util, javax.management,
javax.management.loading, javax.management.modelmbean,
javax.management.monitor, javax.management.openmbean,
javax.management.relation, javax.management.remote,
javax.management.remote.rmi, javax.management.timer, javax.naming,
javax.naming.directory, javax.naming.event, javax.naming.ldap,
javax.naming.spi, javax.net, javax.net.ssl, javax.print,
javax.print.attribute, javax.print.attribute.standard,
javax.print.event, javax.rmi, javax.rmi.CORBA, javax.rmi.ssl,
javax.script, javax.security.auth, javax.security.auth.callback,
javax.security.auth.kerberos, javax.security.auth.login,
javax.security.auth.spi, javax.security.auth.x500, javax.security.cert,
javax.security.sasl, javax.sound.midi, javax.sound.midi.spi,
javax.sound.sampled, javax.sound.sampled.spi, javax.sql,
javax.sql.rowset, javax.sql.rowset.serial, javax.sql.rowset.spi,
javax.swing, javax.swing.border, javax.swing.colorchooser,
javax.swing.event, javax.swing.filechooser, javax.swing.plaf,
javax.swing.plaf.basic, javax.swing.plaf.metal, javax.swing.plaf.multi,
javax.swing.plaf.synth, javax.swing.table, javax.swing.text,
javax.swing.text.html, javax.swing.text.html.parser,
javax.swing.text.rtf, javax.swing.tree, javax.swing.undo, javax.tools,
javax.transaction, javax.transaction.xa, javax.xml, javax.xml.bind,
javax.xml.bind.annotation, javax.xml.bind.annotation.adapters,
javax.xml.bind.attachment, javax.xml.bind.helpers, javax.xml.bind.util,
javax.xml.crypto, javax.xml.crypto.dom, javax.xml.crypto.dsig,
javax.xml.crypto.dsig.dom, javax.xml.crypto.dsig.keyinfo,
javax.xml.crypto.dsig.spec, javax.xml.datatype, javax.xml.namespace,
javax.xml.soap, javax.xml.transform, javax.xml.transform.dom,
javax.xml.transform.sax, javax.xml.transform.stax,
javax.xml.transform.stream, javax.xml.validation, javax.xml.ws,
javax.xml.ws.handler, javax.xml.ws.handler.soap, javax.xml.ws.http,
javax.xml.ws.soap, javax.xml.ws.spi, javax.xml.ws.wsaddressing1,
javax.xml.xpath, org.ietf.jgss, org.omg.CORBA, org.omg.CORBA_2_3,
org.omg.CORBA_2_3.portable, org.omg.CORBA.DynAnyPackage,
org.omg.CORBA.ORBPackage, org.omg.CORBA.portable,
org.omg.CORBA.TypeCodePackage, org.omg.CosNaming,
org.omg.CosNaming.NamingContextExtPackage,
org.omg.CosNaming.NamingContextPackage, org.omg.Dynamic,
org.omg.DynamicAny, org.omg.DynamicAny.DynAnyFactoryPackage,
org.omg.DynamicAny.DynAnyPackage, org.omg.IOP,
org.omg.IOP.CodecFactoryPackage, org.omg.IOP.CodecPackage,
org.omg.Messaging, org.omg.PortableInterceptor,
org.omg.PortableInterceptor.ORBInitInfoPackage, org.omg.PortableServer,
org.omg.PortableServer.CurrentPackage,
org.omg.PortableServer.POAManagerPackage,
org.omg.PortableServer.POAPackage, org.omg.PortableServer.portable,
org.omg.PortableServer.ServantLocatorPackage, org.omg.SendingContext,
org.omg.stub.java.rmi
# specs
felix.auto.start.2= \
.......
file:${felix.home}/lib/ext/geronimo-activation_1.1_spec-1.1.jar \
# libraries
felix.auto.start.3= \
......
file:${felix.home}/lib/ext/geronimo-javamail_1.4_mail-1.8.3.jar \
file:${felix.home}/lib/ext/jolokia-osgi-1.0.4.jar
Relevant sections of the pom.xml for our YouTubeDistribution module
looks like:
<!-- Youtube delivery dependencies -->
<dependency>
<groupId>gdata</groupId>
<artifactId>gdata-client</artifactId>
<version>1.0</version>
<classifier>1.45.0</classifier>
</dependency>
<dependency>
<groupId>gdata</groupId>
<artifactId>gdata-core</artifactId>
<version>1.0</version>
<classifier>1.45.0</classifier>
</dependency>
<dependency>
<groupId>gdata</groupId>
<artifactId>gdata-media</artifactId>
<version>1.0</version>
<classifier>1.45.0</classifier>
</dependency>
<dependency>
<groupId>gdata</groupId>
<artifactId>gdata-youtube</artifactId>
<version>2.0</version>
<classifier>1.45.0</classifier>
</dependency>
<dependency>
<groupId>gdata</groupId>
<artifactId>gdata-youtube-meta</artifactId>
<version>2.0</version>
<classifier>1.45.0</classifier>
</dependency>
..........................
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.0.1</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName> ${project.artifactId}
</Bundle-SymbolicName>
<Private-Package>
com.google.*;-split-package:=merge-first,
org.jdom.*,
flexjson,
</Private-Package>
<Import-Package>
*;resolution:=optional
</Import-Package>
<Export-Package>
org.opencastproject.deliver.youtube.*;version=${project.version},
org.opencastproject.distribution.youtube.*;version=${project.version}
</Export-Package>
<Embed-Dependency>
flexjson;inline=true,
gdata-client;inline=true,
gdata-core;inline=true,
gdata-media;inline=true,
gdata-youtube;inline=true,
google-collections;inline=true,
</Embed-Dependency>
<Service-Component>
OSGI-INF/distribution-service-youtube.xml
</Service-Component>
</instructions>
</configuration>
</plugin>
--
John King
Applications Programmer
Learning Systems Group
Educational Technology Services
9 Dwinelle Hall - Mail
117 Dwinelle Hall - Office
University of California
Berkeley, CA 94720-2535
Phone: 510-529-5074
Email: [email protected]