/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.datatools.connectivity.sql; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.util.EList; import org.teiid.datatools.models.teiidsqlmodel.impl.TeiidSchemaImpl; /** * @since 8.0 */ public class TeiidCatalogSchema extends TeiidSchemaImpl { private Boolean documentsLoaded = Boolean.FALSE; private final Object documents_LOCK = new Object(); @SuppressWarnings("unchecked") private SoftReference documentLoaderRef; protected TeiidCatalogSchema() { super(); } //@SuppressWarnings("rawtypes") @Override public EList getDocuments() { synchronized (documents_LOCK) { if (!documentsLoaded.booleanValue()) loadDocuments(); } return super.getDocuments(); } /* (non-Javadoc) * @see org.eclipse.datatools.connectivity.sqm.core.rte.jdbc.JDBCSchema#refresh() */ @Override public void refresh() { synchronized (documents_LOCK) { if (documentsLoaded.booleanValue()) { documentsLoaded = Boolean.FALSE; } } super.refresh(); } protected final TeiidDocumentLoader getDocumentLoader() { if (documentLoaderRef == null || documentLoaderRef.get() == null) { documentLoaderRef = new SoftReference( createDocumentLoader()); } return (TeiidDocumentLoader) documentLoaderRef.get(); } @SuppressWarnings({ "unchecked" }) private void loadDocuments() { synchronized (documents_LOCK) { boolean deliver = eDeliver(); try { List container = super.getDocuments(); List existingDocuments = new ArrayList(container); eSetDeliver(false); container.clear(); getDocumentLoader().loadDocuments(container, existingDocuments); getDocumentLoader().clearDocuments(existingDocuments); documentsLoaded = Boolean.TRUE; } catch (Exception e) { e.printStackTrace(); } finally { eSetDeliver(deliver); } } } private TeiidDocumentLoader createDocumentLoader() { return new TeiidDocumentLoader(this); } }