Deals with Petals ESB, Petals Suite, SOA, PetalsLink…
Hi,
I have just added a new way to create BPEL processes in the BPEL Designer.
This feature allows to generate a BPEL skeleton from a WSDL port type. Roughly, it means we can generate BPEL processes that implement a given interface. In SOA, such a top-down approach is quite useful. It allows to be driven by service contracts.
In a RCP application I’m working on, I used to have this feature, but implemented through different means (and associated with an older fork of the BPEL Designer). It is now entirely based on the EMF metamodels (those of XML schemas, WSDL and BPEL). Since I want to get rid of this fork, I decided to contribute all my enhancements to the official BPEL Designer at Eclipse.org. And this feature is part of it.
Extending the wizard was also an opportunity to update the user interface in the creation wizard. Obviously, the former options of the wizard have been kept, even if they were reorganized. Here are some screenshots.
First, here is the new approach. You decide to create a BPEL from a WSDL contract…
You define the location of the WSDL and select the contract…
You can even import the WSDL (and its imports) in the project if you want.
And eventually, you decide where to create the BPEL process.
Here is a video of this wizard in action.
Demonstration – WSDL to BPEL from Vincent Zurczak on Vimeo.
And here is how the former options are displayed now.
The next page is about the template and its options.
These options depend on the selected template. A warning was also added to the “empty” template (this follows a discussion we had on the BPEL-dev mailing-list).
And you have already seen the page to select the target location.
This contribution comes with SWTBot tests and a new plugin with utilities for WSDL and XML schemas. It was committed on a branch (thanks Git!). This way, it can be commented and discussed. Hopefully, this branch should then be merged with the master branch.
I recently had to work with the WSDL metamodel from Eclipse WTP.
I thought it may be useful to compare it with other WSDL parsing solutions. Notice that I will focus on Java solutions here.
WSDL stands for Web Services Description Language.
It is a W3C specification to describe the interface / contract of a service. A WSDL contract is defined in a *.wsdl file. This file describes the service operations, their input and output parameters, the declaration of services, their reach location and the communication protocol to use to interact with them. A *.wsdl file may import other WSDL and also XML schemas (they contain the type definition of operation parameters).
There are two versions of WSDL that may be worked with: WSDL 1.1 and WSDL 2.0.
Although WSDL 2.0 is conceptually better (in particular because of MEP – Message Exchange Patterns), WSDL 1.1 is the most used. There are very few tools and libraries libraries which support it (Axis 2 supports it, CXF does not, JAX-WS did not plan its support). And it must be said that the two versions are different in the approach and some concepts do not match at all.
And in WSDL 1.1, there are some distinctions, such as the style (document / wrapped, xml-rpc…).
Information about this can be found on the internet.
For WSDL 1.1, the most famous solution is WSDL4j.
This library provides an easy (and light!) solution to parse WSDL definitions. Its only limitation in my opinion, is that it is not easy to introspect XML schemas with it.
For WSDL 2.0, there is Apache Woden.
This library allows to parse WSDL (2.0) definitions and to convert WSDL (1.1) definitions to WSDL 2.0 (again, both versions are very different).
Then, there is a more recent project called EasyWSDL.
The versions 1.x and 2.x aimed at providing a single API to parse and edit WSDL 1.1 and WSDL 2.0 definitions. Unfortunately, this API makes an important use of Java generics. However, it is easy to navigate in XML schema with it. The version 3.x is still in incubation but took a very different turn. To simplify the API, and because it was ambiguous, it was decided to separate the API for the various versions of the specification. For the moment, EasyWSDL 3.x only supports WSDL 1.1. The API is much more simple and it is still easy to navigate in XML schemas. Besides, it can execute XPath queries on a macro document (the main document and all the import as a single virtual document). However, it misses some helpers to work with imports (writing XPath queries is not very user-friendly).
Eventually, there is the EMF metamodel for WSDL.
The metamodel is provided by the WTP project at Eclipse. It can only parse WSDL 1.1. In fact, I found out that it relies on and extends WSDL4j. One of the main improvements is that it can introspect XML schemas. To use it, you have to put the EMF libraries and some WTP libraries in your dependencies:
/**
* Finds all the port types declared in the WSDL or in its imported documents.
* @param emfUri an EMF URI pointing to a WSDL definition
*/
List<PortType> findAllPortTypes( URI emfUri ) {
// Register the basic elements of the specification
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xml", new XMLResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xsd", new XSDResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "wsdl", new WSDLResourceFactoryImpl());
resourceSet.getPackageRegistry().put( XSDPackage.eNS_URI, XSDPackage.eINSTANCE );
resourceSet.getPackageRegistry().put( WSDLPackage.eNS_URI, WSDLPackage.eINSTANCE );
// Register the required extensions
// None here
// Load the main document
Resource resource = resourceSet.getResource( emfUri, true );
Definition def = (Definition) resource.getContents().iterator().next();
// Add the initial definition
Set<Definition> definitions = new HashSet<Definition> ();
definitions.add( alreadyLoadedDefinition );
// Process the imports
processImports( alreadyLoadedDefinition.getImports(), definitions );
// Get all the port types
List<PortType> portTypes = new ArrayList<PortType> ();
for( Definition def : definitions ) {
for( Object o : def.getPortTypes().values())
portTypes.add((PortType) o );
}
return portTypes;
}
/**
* Finds the definitions from imports and processes them recursively.
* @param imports a map of imports (see {@link Definition#getImports()})
* @param definitions a list of definitions, found from import declarations
*/
private static void processImports( Map<?,?> imports, Collection<Definition> definitions ) {
for( Object o : imports.values()) {
// Case "java.util.list"
if( o instanceof List<?> ) {
for( Object oo : ((List<?>) o)) {
Definition d = ((Import) oo).getEDefinition();
if( d != null && ! definitions.contains( d )) {
definitions.add( d );
processImports( d.getImports(), definitions );
}
}
}
// Case "org.eclipse.wst.Definition"
else if( o instanceof Definition ) {
Definition d = (Definition) o;;
if( ! definitions.contains( d )) {
definitions.add( d );
processImports( d.getImports(), definitions );
}
}
}
}
XML schema can be accessed with this solution.
This is possible thanks to the metamodel for XML schemas.
As an example, here is how to parse a XML schema with this metamodel. Note that this metamodel is not only an EMF library, it is also bridged with a DOM model. In fact, this is also true for the WSDL metamodel (generally, this is not the case with EMF metamodels).
/**
* Loads a XML schema.
* @param emfUri an EMF URI
* @return an instance of {@link XSDSchema}
* <p>
* This object already supports inclusions, which means there is no need to
* get the imports and parse them.
* </p>
*/
public static XSDSchema loadXmlSchema( URI emfUri ) {
// Register the basic elements
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xml", new XMLResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xsd", new XSDResourceFactoryImpl());
resourceSet.getPackageRegistry().put( XSDPackage.eNS_URI, XSDPackage.eINSTANCE );
// Load the resource
Resource resource = resourceSet.getResource( emfUri, true );
return (XSDSchema) resource.getContents().iterator().next();
}
Like most of standards, WSDL supports extensions.
In this sample, I use an extension for BPEL.
Definition createWsdlArtifact( String newWsdlUrl ) {
// Initial data we got from another WSDL definition
PortType portType = this.portTypePage.getPortType();
Definition businessDefinition = (Definition) portType.eContainer();
// The new definition to create
Definition artifactsDefinition = WSDLFactory.eINSTANCE.createDefinition();
artifactsDefinition.setTargetNamespace( businessDefinition.getTargetNamespace() + "Artifacts" );
// Hack for the role: we need to define manually the name space prefix for the TNS of the business WSDL
artifactsDefinition.getNamespaces().put( "tns", businessDefinition.getTargetNamespace());
// WSDL import
Import wsdlImport = WSDLFactory.eINSTANCE.createImport();
wsdlImport.setLocationURI( newWsdlUrl );
wsdlImport.setNamespaceURI( businessDefinition.getTargetNamespace());
artifactsDefinition.addImport( wsdlImport );
// Partner Link Type
PartnerLinkType plType = PartnerlinktypeFactory.eINSTANCE.createPartnerLinkType();
plType.setName( portType.getQName().getLocalPart() + "PLT" );
Role plRole = PartnerlinktypeFactory.eINSTANCE.createRole();
plRole.setName( portType.getQName().getLocalPart() + "Role" );
plRole.setPortType( portType );
plType.getRole().add( plRole );
plType.setEnclosingDefinition( artifactsDefinition );
// This is an extension, here is how to add it
artifactsDefinition.getEExtensibilityElements().add( plType );
return artifactsDefinition;
}
And here is how to write it.
void writeDefinition( Definition def, File targetFile ) {
// Register the basic elements of the specification
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xml", new XMLResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "xsd", new XSDResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "wsdl", new WSDLResourceFactoryImpl());
resourceSet.getPackageRegistry().put( XSDPackage.eNS_URI, XSDPackage.eINSTANCE );
resourceSet.getPackageRegistry().put( WSDLPackage.eNS_URI, WSDLPackage.eINSTANCE );
// Register the required extensions
resourceSet.getPackageRegistry().put( PartnerlinktypePackage.eNS_URI, PartnerlinktypePackage.eINSTANCE );
// Create a resource...
URI emfUri = URI.createFileURI( targetFile.getAbsolutePath());
Resource resource = resourceSet.createResource( emfUri );
resource.getContents().add( def );
// ... and save it
// See @link{org.eclipse.emf.ecore.xmi.XMLResource} for examples of SAVE options
Map<Object,Object> saveOptions = new HashMap<Object,Object> ();
resource.save( saveOptions );
}
I have been working with WSDL for several years. And to be honest, I had never thought about using the WSDL metamodel outside Eclipse. I knew it was there, I knew how to work with EMF. But for me, it was more a tool than a real library. And somehow, this is true. But the fact is that it is not complicated to use. And it can also work in standalone applications, not only in Eclipse.
So, this may be a solution to consider, depending on your needs.
In: Christophe Hamerling|eda|Petals ESB|petalslink|soa|twitter
3 Nov 2011Last week was the first annual review meeting of the Play project I work on since one year. I am involved at several levels in this project: from the architecture point of view, to the software integration and quality ones. On my side, my goal is to provide the efficient software infrastructure for events actors, or how to build an Event Driven Architecture based on Petals Distributed Service Bus. There are others points which have to be developed, especially all the platform governance stuff and Service Level Agreement for events, what we call Event Level Agreement.
We showed several things to the European Commission reviewers and we were also able to show an early prototype (this one was originally planned to be show at mid project ie in 6 months…). I made a video capture of the demo, which really needs to be explained…
So do we need such machinery to do things like that? No, if you want to do some other simple mashup portal. There are several components which are under active development: Storage and processing. Yes we store all events in the Play platform. This storage will be huge, but it is one of the project goal: Providing efficient and elastic storage in some P2P way. The need for this storage comes with the other important aspect of the project: Complex Event Processing. We will soon be able to create complex rules on top of events and be able to generate notifications based on past and real time notifications because we have efficient storage and real time stuff inside the platform. I am not an expert of this domain, so I can not give more details about that point but capabilities are huge! For example, we can express something like “Hey Play, can you send me a SMS me when there is my favorite punk rock band playing just around and I am not on a business trip and X and !Y or Z”. All of this intelligence coming from the processing of various sources I push since months in the platform coming from Twitter, FB, last.fm and other data providers.
Now let’s take some time to work on my OW2Con talk. The session name is pretty cool : Open Cloud Summit Session.
For those who did not follow GMF Tooling development in the last year, then let’s say that you missed a complex history. Since most of the contributors have changed, GMF Tooling had trouble to set up a new efficient leadership, had trouble to provide builds, did not succeed to get into the Indigo release train, and could not provide a release that is compliant with Indigo… That was a sad part of GMF Tooling history! But this is now over. Here are the recent accomplishment that make GMF Tooling back to active life:
A lot of people were waiting for it, it finally occurs: GMF Tooling (finally) has a release that works with the Eclipse Indigo release! It is mainly made of bug fixes and compatibility improvements. Here is the p2 repository: http://download.eclipse.org/modeling/gmp/gmf-tooling/updates/releases/
After lots of mails, the GMF Team, helped by the Modeling PMC, was able to nominate a new lead to overview the GMF Tooling contributors team and development. He is Michael Golubev, often known as “borlander” on bugs and forums. who works for Montages as a full-time developer for GMF Tooling. He has also been the lead of UML2 Tools.
GMF Tooling now has a Tycho builder, that is far easier to maintain and run than the legacy one. So contributors can now run tests very easily with a “mvn clean install” to ensure their work did not break anything. That makes contributing much easier. Moreover, the build is hosted on hudson.eclipse.org so that it is easy and transparent to get an idea of how healthy is the code. Also, going to continuous integration on Eclipse servers allows to produce builds that are equivalent to the one that will be released (including signing and all the necessary Eclipse stuff). So there is no more additional difficulty building a release than building a snapshot.
The Modeling Discovery wizard is a wizard that appears when downloading the Eclipse Modeling package to suggest you some projects to install and use. GMF Tooling just get back into it as I am writing this post!
We also made the efforts to ensure the future of GMF Tooling will be less chaotic than it was for Indigo. We already did most of the necessary stuff to get GMF Tooling in the Juno release train. So, no stress this year! More details here.
See this effort in my previous post. This is an undefinitely work in progress, so feel free to contribute directly by making the wiki easier to navigate.
A lot of things + what the community will think about contributing. The project plan for GMF-Tooling 3.0 (yes, 3.0!) is not yet finished, but here are some key objectives:
I think GMF Tooling just achieved a major step, and I bet this is the beginning of a new, leaner, era for Graphical Modeling!
In: Eclipse
28 Oct 2011SoftShake 2011 was now several weeks ago! This was a very nice conference, quite well organized, with different tracks that make easy for you to always find something interesting to learn.
Before speaking of the sessions I like, I have to say that there were a lot of sessions in just 2 days, and I had been busy during the conference to talk with some people during the sessions. So I missed most of them, maybe some very good ones. So this is not of “best of all sessions”, but more a “best of the 9 sessions I saw”.
Kudos to Hamlet D’Arcy who presented how the compile-time annotations, such as the one proposed by the Lombok project, are processed by compilers to modify the internal AST model of your code, and add behavior to your code automatically. It was interesting, simple to understand, and easy to find how it applies in everyday’s developer life.
I also liked the presentation “Data Grids vs Databases” from Galder Zamarreño from the Infinispan team. I am not very easy will all this Data-driven stuff, but after this presentation, I now know when to use a Data Grid or a Database. However, I am still not sure how all these things compare to Object Databases, such as Objectivity.
And I also found the présentation from Sébastion Douche interesting. It told us the story of the product and team he manages, how his team leverage Git, how they industrialize builds, and everything they do to make their working life easier. That’s alwasys good to hear that kind of tips.
Here is the slides of my “Modeling with Eclipse” presentation, with materials available on GitHub:
I enjoyed a lot presenting it, although I had my laptop taking lot of time between 2 operations, so that demonstrations got longer than expected. I counted 26 attendees. I hope I gave them enough examples to understand how powerful is the Modeling ecosystem at Eclipse, and how productive are the tools available.
And here are the slides from my colleague Jean-Christophe Reigner (PetalsLink Chief Services Officer) that he used to explain what is an ESB, why and when it is useful, and to show some concrete use-cases of ESB:
I liked his presentation, it was quite clear, and I could learn more about ESB in a general IT architect point of view. I think people in the room felt the same thing.
As a speaker too, it was really very cool to be there since the organizing team made everything necessary to get speakers happy, providing help and chocolate during the conference, and inviting us to a very good restaurant where we could discover, for those who did not know that already, the Swiss gastronomy.

Swiss Gastronomy Part I: "La fondue moit-moit"

Swiss gastronomy Part II: "Les meringues double-creme"
So, I hope I’ll make it again for SoftShake 2012 !
In: Christophe Hamerling|java|Petals ESB|Petals ESB|petalslink
13 Oct 2011Almost true… In fact Petals DSB uses and extends Petals ESB in several ways. When I started to think about extending the Enterprise Service Bus, it was just to avoid all the JBI stuff at the management level i.e. use a real, simple and efficient API. So I added many management stuff exposed as Web services : Bind external services, expose internal services (oh yes bind + expose = proxy), get endpoints, activate things, etc…
One other goal was to avoid to use closed protocols for inter node communication: The ESB uses at least three ports to create inter node communications for JMX, NIO and SOAP. So why not, just using an open protocol like SOAP and just one port? This is what I did, I changed some implementations to use the same port and the same protocol for all services.
All this stuff has been developed focusing on extensibility and easier development. This is mainly because the ESB can be hard to extend for newbies, there are so many things inside… Today the DSB is not only a Distributed Service Bus, it is also a framework so that developers can easily extend the DSB without the need to know how it works inside. Some examples? Want to expose a kernel service : Add the JAXWS @WebService annotation. Want to subscribe to Web service notifications : Annotate you Java method with @Notify. Want to be notified about new endpoints : Add the @RegistryListener annotation. That’s all, you do not have to search for the Web service server to expose your service, nor read all the WSN documentation to receive notifications, … Simple, efficient.
There are other things you can do, mostly all is detailed in the DSB page.
This year again, I submitted a talk proposal to the OW2 annual conference and it has just been approved by the OW2 management office.
While last year I spoke about some conceptual things around the Distributed Service Bus and the Cloud, this year I will go one step further with some live demonstrations not only dealing with service bus stuff, but also with some BPM tools and the Cloud stack we actively develop in the research team at PetalsLink. Here is my talk proposal:
All the services are moving to the Cloud, so are business processes. In this talk, we will show how to create collaborative business processes using an open source SaaS BPMN Editor. But designing business processes is not enough, why not running them in the Cloud? We will see that we can rely on a completely Cloud-aware SOA software infrastructure combining several open sources solutions such as a Service Bus and IaaS framework. The resulting ‘Cloud Service Bus’ allows the integration of in-house services in order to benefit from Cloud-based features such as elasticity, load balancing, service clustering and migration. This Cloud Service Bus will serve as the runtime basis of the business processes producing a Petals Cloud Stack solution. All in the Cloud, all open source!
I really hope to have time to work on some cool things to add more foggy-cloudy stuff and have things running on a real cloud infrastructure. I have many ideas in my mind these days and it is really really really cool.
Oh and I will also talk a bit about what we are currently building in the Play FP7 project. We have to show things in two weeks at the European Commission and these things are really interesting to share with OW2 attendees and staff.
BTW, I think that there is some free beer social event this year at OW2Con, see you there of course!
In: Uncategorized
9 Oct 2011Here is the story.
I have a free account on Mediafire, where I host some files to be shared. This site provides a nice user experience. This is true for those who download, but also for those whose share files with it (the file management is really good).
The fact is that I would like to be able to list my files from an external application. It is just a way to retrieve my links to share them. Then, people will go on Mediafire to download the files. Mediafire provides an API, but it does not support this feature.
After a quite long search, I finally found a way to list my files.
It was quite hard because authentication is required and because files are not listed in the HTML source but entirely added in the page with Javascript. So, here is the solution (implemented it in Java). For this, I used HTML Unit, but it should also work with Cobra.
/**
* List file links associated with a given Mediafire account.
* @author Vincent Zurczak
*/
public class MediafireTest {
/**
* @param args
*/
public static void main(String[] args) {
// Create a web client
final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3_6 );
webClient.setThrowExceptionOnScriptError( false );
webClient.setCssEnabled( false );
webClient.setIncorrectnessListener( new IncorrectnessListener() {
@Override
public void notify(String arg0, Object arg1) {
// Nothing
}
});
try {
final HtmlPage page = webClient.getPage( "http://www.mediafire.com/" );
System.getProperties().put( "org.apache.commons.logging.simplelog.defaultlog", "fatal" );
// Log in
final HtmlForm form = page.getFormByName( "form_login1" );
HtmlTextInput emailField = form.getInputByName( "login_email" );
emailField.setValueAttribute( "your email" );
HtmlPasswordInput pwdField = form.getInputByName( "login_pass" );
pwdField.setValueAttribute( "your password" );
final HtmlImageInput button = form.getInputByName( "submit_login" );
HtmlPage page2 = (HtmlPage) button.click();
// Then, get the JS script to extract the links
// We parse the script and not the modified HTML (which I did not succeed BTW)
JavaScriptPage jsPage = webClient.getPage( "http://www.mediafire.com/js/myfiles.php/?45144" );
// 45144: seems to be the same ID for all (anonymous and registered account)
Pattern pattern = Pattern.compile( "es\\[\\d+\\]=Array\\(([^;]*)\\);" );
Matcher m = pattern.matcher( jsPage.getContent());
while( m.find()) {
String[] parts = m.group( 1 ).split( "," );
String link = removeSurroundingQuotes( parts[ 3 ]);
String filename = removeSurroundingQuotes( parts[ 5 ]);
System.out.println( filename + ": http://mediafire/download.php?" + link );
}
} catch( FailingHttpStatusCodeException e ) {
e.printStackTrace();
} catch( MalformedURLException e ) {
e.printStackTrace();
} catch( IOException e ) {
e.printStackTrace();
} finally {
webClient.closeAllWindows();
}
}
/**
* Removes surrounding quotes.
* @param s a string
* <p>
* If the string is null or if its length is lesser than 2, then the original string is returned.
* If the first and last characters are different, then the original string is returned.
* If the first character is not a single quote or a double quote, then the original string is returned.
* Otherwise, the first and last characters are returned.
* </p>
*/
private static String removeSurroundingQuotes( String s ) {
String result;
if( s == null )
result = s;
else {
int length = s.length();
if( length < 2 )
result = s;
else if( s.charAt( 0 ) != s.charAt( length - 1 ))
result = s;
else if( s.charAt( 0 ) != '\'' && s.charAt( 0 ) != '"' )
result = s;
else
result = s.substring( 1, s.length() - 1 );
}
return result;
}
}
In: Vincent Zurczak
7 Oct 2011Vendredi 7 octobre. 12h40. On m’appelle pour me demander un tutoriel vidéo, tutoriel qui pourrait servir d’anti-sèche bientôt.
Ce n’est pas la première fois que j’ai à faire des tutoriels. Ce qui m’embête, c’est l’aspect vidéo. Avant, j’utilisais Wink pour faire des démos. Sauf que partager du flash, par mail ou sur des sites de vidéos, tels que Vimeo ou Youtube, ce n’est pas génial. A cause de cet appel, j’ai dû me replonger dans cette jungle, pour finalement (re)découvrir que VLC Media Player pouvait vous aider à enregistrer ce qui passe sur votre écran.
Voilà comment faire.
Vous lancez VLC et vous aller dans Média > Convertir / Enregistrer.
Vous allez ensuite dans Périphériques de capture.
Dans le mode de capture, vous choisissez Bureau.
Dans les options, je vous suggère de mettre 24 ips (images par seconde). Moins, votre vidéo sera lue très vite. Plus, ce sera un ralenti. Enfin, en bas, vous cliquez sur Convertir / Sauvegarder.
Il vous faut ensuite indiquer le fichier de sortie pour la vidéo (dans quoi vous enregistrez).

Appuyez donc sur Parcourir, sélectionnez le dossier de destination et le nom du fichier. N’oubliez pas de préciser l’extension du fichier. Dans mon cas, j’essaye avec du mp4. Puis cliquez sur Enregistrer.
Au retour, vous pouvez configurer les codecs utilisés.
Voilà, vous êtes prêt !
Il vous suffit de cliquer sur Démarrer pour commencer la capture.
Pour l’arrêter, allez dans Lecture > Stop.
Petit conseil…
Aujourd’hui, j’étais en mode “débordé” et j’ai par défaut utilisé du mp4 avec codec H.264. Sauf que l’encodage en H.264 est super gourmand en ressources. Et ce n’est pas un codec facile à manipuler ensuite. Aussi, je vous conseille plutôt d’enregistrer en mpg (avec codec mpeg-II), qui est un format plus facile à éditer. Vous pourrez ensuite faire du montage linéaire (ou non-linéaire), rajouter des commentaires audio, etc. Après, libre à vous de compresser le résultat final (après édition) ou de l’envoyer sur un site de partage.
Pour info, j’ai VLC 1.1.5, sous Windows 7.
Mais ça doit marcher sur toutes les plateformes…