/* * Copyright 2008 Lockheed Martin Corporation, except as stated in the file * entitled Licensing-Information. All modifications copyright 2009 Data Access Technologies, Inc. Licensed under the Academic Free License * version 3.0 (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. * * Contributors: * MDS - initial API and implementation * */ package org.modeldriven.fuml.library; import java.io.InputStream; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.modeldriven.fuml.config.FumlConfiguration; import org.modeldriven.fuml.config.LibraryConfiguration; import org.modeldriven.fuml.config.LibraryImport; import org.modeldriven.fuml.io.ArtifactLoader; import org.modeldriven.fuml.io.ResourceArtifact; import org.modeldriven.fuml.repository.Element; import org.modeldriven.fuml.repository.Repository; import fUML.Syntax.Classes.Kernel.NamedElement; public class Library { private static Log log = LogFactory.getLog(Library.class); private static Library instance = null; private LibraryConfiguration config; private Library() { } public static Library getInstance() throws LibraryException { if (instance == null) initializeInstance(); return instance; } private static synchronized void initializeInstance() { if (instance == null) { // NOTE: Separating initialization from construction avoids the // possibility of an infinite loop if an attempt is made to // access the library instance during initialization. instance = new Library(); instance.initialize(); } } private void initialize() { log.info("initializing..."); config = FumlConfiguration.getInstance().getConfig().getLibraryConfiguration(); if (config != null && config.getLibraryImport() != null) { Iterator<LibraryImport> libraryImports = config.getLibraryImport().iterator(); while (libraryImports.hasNext()) { load(libraryImports.next()); } } } private void load(LibraryImport libraryImport) { log.info("loading library artifact, " + libraryImport.getName()); InputStream stream = Library.class.getResourceAsStream(libraryImport.getName()); if (stream == null) throw new LibraryException("cannot find resource '" + libraryImport.getName() + "'"); ResourceArtifact artifact = new ResourceArtifact(libraryImport.getName(), libraryImport.getUrn(), stream); ArtifactLoader reader = new ArtifactLoader(); reader.read(artifact); log.info("completed library artifact, " + libraryImport.getName()); } public NamedElement lookup(String id) { Element elem = Repository.INSTANCE.findElementById(id); if (elem != null) return (NamedElement)elem.getDelegate(); else return null; } }