// $Id: XmiWriterEUMLImpl.java 16147 2008-11-23 18:03:41Z tfmorris $
// Copyright (c) 2007, The ArgoUML Project
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the ArgoUML Project nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE ArgoUML PROJECT ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE ArgoUML PROJECT BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.argouml.model.euml;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.argouml.model.UmlException;
import org.argouml.model.XmiExtensionWriter;
import org.argouml.model.XmiWriter;
import org.eclipse.emf.ecore.xmi.XMLResource;
/**
* Eclipse UML2 implementation of XmiWriter.
*
* TODO: We need facilities for writing and reading stable IDs to/from either
* xmi.id or xmi.uuid.
*
* @author Tom Morris
*/
class XmiWriterEUMLImpl implements XmiWriter {
/**
* The model implementation.
*/
private EUMLModelImplementation modelImpl;
private OutputStream oStream;
private org.eclipse.uml2.uml.Package model;
/**
* Constructor.
*
* @param implementation
* The ModelImplementation.
* @param model
* The project member model.
* @param writer
* The writer.
* @param version
* The version of ArgoUML.
*/
public XmiWriterEUMLImpl(EUMLModelImplementation implementation,
Object theModel, OutputStream stream, String version) {
if (stream == null) {
throw new IllegalArgumentException(
"An OutputStream must be provided"); //$NON-NLS-1$
}
if (!(theModel instanceof org.eclipse.uml2.uml.Package)) {
throw new IllegalArgumentException("A container must be provided" //$NON-NLS-1$
+ " and it must be a UML 2 Package"); //$NON-NLS-1$
}
if (implementation == null) {
throw new IllegalArgumentException("A parent must be provided"); //$NON-NLS-1$
}
modelImpl = implementation;
model = (org.eclipse.uml2.uml.Package) theModel;
oStream = stream;
}
public void write() throws UmlException {
if (model.eResource() == null) {
throw new UmlException(
"Root container is not affiliated with any resource!"); //$NON-NLS-1$
}
// Do we need to get stereotype applications for each element? - tfm
// for (Iterator allContents = UMLUtil.getAllContents(model, true,
// false); allContents.hasNext();) {
// EObject eObject = (EObject) allContents.next();
// if (eObject instanceof Element) {
// contents.addAll(((Element) eObject).getStereotypeApplications());
// }
// }
Map<String, Integer> options = new HashMap<String, Integer>();
options.put(XMLResource.OPTION_LINE_WIDTH, 100);
// TODO: Is there an option we can use to save our ArgoUML version?
try {
modelImpl.getModelEventPump().stopPumpingEvents();
model.eResource().save(oStream, options);
} catch (IOException ioe) {
throw new UmlException(ioe);
} finally {
modelImpl.getModelEventPump().startPumpingEvents();
}
}
public void setXmiExtensionWriter(XmiExtensionWriter xmiExtensionWriter) {
throw new NotYetImplementedException();
}
}