Coverage Report - org.argouml.profile.URLModelLoader
 
Classes in this File Line Coverage Branch Coverage Complexity
URLModelLoader
48%
12/25
37%
3/8
4
 
 1  
 /* $Id: URLModelLoader.java 18282 2010-04-18 08:50:37Z tfmorris $
 2  
  *****************************************************************************
 3  
  * Copyright (c) 2009 Contributors - see below
 4  
  * All rights reserved. This program and the accompanying materials
 5  
  * are made available under the terms of the Eclipse Public License v1.0
 6  
  * which accompanies this distribution, and is available at
 7  
  * http://www.eclipse.org/legal/epl-v10.html
 8  
  *
 9  
  * Contributors:
 10  
  *    tfmorris
 11  
  *****************************************************************************
 12  
  *
 13  
  * Some portions of this file was previously release using the BSD License:
 14  
  */
 15  
 
 16  
 // Copyright (c) 2007-2008 The Regents of the University of California. All
 17  
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 18  
 // software and its documentation without fee, and without a written
 19  
 // agreement is hereby granted, provided that the above copyright notice
 20  
 // and this paragraph appear in all copies. This software program and
 21  
 // documentation are copyrighted by The Regents of the University of
 22  
 // California. The software program and documentation are supplied "AS
 23  
 // IS", without any accompanying services from The Regents. The Regents
 24  
 // does not warrant that the operation of the program will be
 25  
 // uninterrupted or error-free. The end-user understands that the program
 26  
 // was developed for research purposes and is advised not to rely
 27  
 // exclusively on the program for any reason. IN NO EVENT SHALL THE
 28  
 // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
 29  
 // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
 30  
 // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
 31  
 // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
 32  
 // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
 33  
 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 34  
 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
 35  
 // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
 36  
 // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
 37  
 // UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 38  
 
 39  
 package org.argouml.profile;
 40  
 
 41  
 import java.io.IOException;
 42  
 import java.net.MalformedURLException;
 43  
 import java.net.URL;
 44  
 import java.util.Collection;
 45  
 import java.util.zip.ZipEntry;
 46  
 import java.util.zip.ZipInputStream;
 47  
 
 48  
 import org.argouml.model.Model;
 49  
 import org.argouml.model.UmlException;
 50  
 import org.argouml.model.XmiReader;
 51  
 import org.xml.sax.InputSource;
 52  
 
 53  
 /**
 54  
  * Abstract ProfileModelLoader which loads models from a URL.
 55  
  *
 56  
  * @author Tom Morris, Thomas Neustupny
 57  
  */
 58  900
 public class URLModelLoader implements ProfileModelLoader {
 59  
 
 60  
     /**
 61  
      * Load a profile from a URL.  If a profile with the same public ID has 
 62  
      * already been loaded, its contents are returned instead of loading the
 63  
      * new profile.
 64  
      * 
 65  
      * @param url the url/system id to load
 66  
      * @param publicId the publicId for which the model will be known - must be
 67  
      *                equal in different machines in order to be possible to
 68  
      *                load the model.  If a profile with this public ID has 
 69  
      *                already been loaded, it is returned instead.
 70  
      * @return a collection of top level elements in the profile (usually a
 71  
      *         single package stereotyped <<profile>>
 72  
      * @throws ProfileException if the XMIReader couldn't read the profile
 73  
      */
 74  
     public Collection loadModel(URL url, URL publicId) 
 75  
         throws ProfileException {
 76  900
         if (url == null) {
 77  0
             throw new ProfileException("Null profile URL");
 78  
         }
 79  
         
 80  900
         Collection elements = 
 81  
             Model.getUmlFactory().getExtentPackages(publicId.toExternalForm());
 82  900
         if (elements == null) {
 83  900
             ZipInputStream zis = null;
 84  
             try {
 85  900
                 XmiReader xmiReader = Model.getXmiReader();
 86  900
                 if (url.getPath().toLowerCase().endsWith(".zip")) {
 87  0
                     zis = new ZipInputStream(url.openStream());
 88  0
                     ZipEntry entry = zis.getNextEntry();
 89  
                     // TODO: check if it's OK to just get the first zip entry
 90  
                     // since the zip file should contain only one xmi file - thn
 91  0
                     if (entry != null) {
 92  0
                         url = makeZipEntryUrl(url, entry.getName());
 93  
                     }
 94  0
                     zis.close();
 95  
                 }
 96  900
                 InputSource inputSource = new InputSource(url.toExternalForm());
 97  900
                 inputSource.setPublicId(publicId.toString());
 98  900
                 elements = xmiReader.parse(inputSource, true);
 99  0
             } catch (UmlException e) {
 100  0
                 throw new ProfileException("Error loading profile XMI file ", e);
 101  0
             } catch (IOException e) {
 102  0
                 throw new ProfileException("I/O error loading profile XMI ", e);
 103  900
             }
 104  
         }
 105  900
         return elements;
 106  
     }
 107  
 
 108  
     /**
 109  
      * Load a profile from a ProfileReference.
 110  
      * 
 111  
      * @param reference ProfileReference for desired profile
 112  
      * @return a collection of top level elements in the profile (usually a
 113  
      *         single package stereotyped <<profile>>
 114  
      * @throws ProfileException if the XMIReader couldn't read the profile
 115  
      */
 116  
     public Collection loadModel(final ProfileReference reference)
 117  
         throws ProfileException {
 118  0
         return loadModel(reference.getPublicReference(), reference
 119  
                 .getPublicReference());
 120  
     }
 121  
 
 122  
     private URL makeZipEntryUrl(URL url, String entryName)
 123  
         throws MalformedURLException {
 124  0
         String entryURL = "jar:" + url + "!/" + entryName;
 125  0
         return new URL(entryURL);
 126  
     }
 127  
 }