// $Id: XmiReaderEUMLImpl.java 16157 2008-11-24 06:14:33Z tfmorris $ // Copyright (c) 2007,2008 Tom Morris and other contributors // 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.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.argouml.model.UmlException; import org.argouml.model.XmiReader; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.EditingDomain; import org.xml.sax.InputSource; /** * The implementation of the XmiReader for EUML2. */ class XmiReaderEUMLImpl implements XmiReader { /** * The model implementation. */ private EUMLModelImplementation modelImpl; private static Set<String> searchDirs = new HashSet<String>(); private Resource resource; /** * Constructor. * * @param implementation * The ModelImplementation. */ public XmiReaderEUMLImpl(EUMLModelImplementation implementation) { modelImpl = implementation; } public int getIgnoredElementCount() { // TODO: Auto-generated method stub return 0; } public String[] getIgnoredElements() { // TODO: Auto-generated method stub return new String[0]; } public Map getXMIUUIDToObjectMap() { if (resource == null) { throw new IllegalStateException(); } Map<String, EObject> map = new HashMap<String, EObject>(); Iterator<EObject> it = resource.getAllContents(); while (it.hasNext()) { EObject o = it.next(); map.put(resource.getURIFragment(o), o); } return map; } public Collection parse(InputSource inputSource, boolean readOnly) throws UmlException { if (inputSource == null) { throw new NullPointerException( "The input source must be non-null."); //$NON-NLS-1$ } InputStream is = null; boolean needsClosing = false; if (inputSource.getByteStream() != null) { is = inputSource.getByteStream(); } else if (inputSource.getSystemId() != null) { try { URL url = new URL(inputSource.getSystemId()); if (url != null) { is = url.openStream(); if (is != null) { is = new BufferedInputStream(is); needsClosing = true; } } } catch (MalformedURLException e) { // do nothing } catch (IOException e) { // do nothing } } if (is == null) { throw new UnsupportedOperationException(); } // TODO: This won't work if the user loads a profile and then // a user model or multiple user models. - tfm modelImpl.clearEditingDomain(); Resource r = UMLUtil.getResource(modelImpl, UMLUtil.DEFAULT_URI, readOnly); try { modelImpl.getModelEventPump().stopPumpingEvents(); r.load(is, null); } catch (IOException e) { throw new UmlException(e); } finally { modelImpl.getModelEventPump().startPumpingEvents(); if (needsClosing) { try { is.close(); } catch (IOException e) { throw new RuntimeException(e); } } } resource = r; return r.getContents(); } public boolean setIgnoredElements(String[] elementNames) { // TODO: Auto-generated method stub return false; } public String getTagName() { if (resource == null) { throw new IllegalStateException(); } List l = resource.getContents(); if (!l.isEmpty()) { return "uml:" + modelImpl.getMetaTypes().getName(l.get(0)); //$NON-NLS-1$ } else { return null; } } public void addSearchPath(String path) { searchDirs.add(path); } public List<String> getSearchPath() { return new ArrayList<String>(searchDirs); } public void removeSearchPath(String path) { searchDirs.remove(path); } public String getHeader() { // TODO: Auto-generated method stub throw new NotYetImplementedException(); } }