/* * #%L * gitools-core * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.api.resource; import org.gitools.api.ApplicationContext; import org.gitools.api.PersistenceException; import org.gitools.api.analysis.IProgressMonitor; import org.gitools.api.resource.adapter.ResourceReferenceXmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class) public class ResourceReference<R extends IResource> { private transient boolean loaded = false; private transient boolean changed = false; private transient R resource; // New instance private String baseName; private Class<? extends R> resourceClass; // Stored instance private IResourceLocator locator; private IResourceFormat<? extends R> resourceFormat; public ResourceReference(String baseName, R resource) { this(baseName, resource, (Class<? extends R>) resource.getClass()); } public ResourceReference(String baseName, Class<? extends R> resourceClass) { this(baseName, null, resourceClass); } public ResourceReference(IResourceLocator locator, Class<? extends R> resourceClass) { this(locator, ApplicationContext.getPersistenceManager().getFormat(locator.getExtension(), resourceClass)); } public ResourceReference(IResourceLocator locator, IResourceFormat<? extends R> resourceFormat) { this.loaded = false; this.baseName = locator.getBaseName(); this.resourceClass = resourceFormat.getResourceClass(); this.resource = null; this.locator = locator; this.resourceFormat = resourceFormat; } private ResourceReference(String baseName, R resource, Class<? extends R> resourceClass) { this.loaded = true; this.baseName = baseName; this.resourceClass = resourceClass; this.resource = resource; this.locator = null; String extension = ApplicationContext.getPersistenceManager().getDefaultExtension(resourceClass); this.resourceFormat = ApplicationContext.getPersistenceManager().getFormat(extension, resourceClass); } public final R get() { if (!isLoaded()) { try { load(ApplicationContext.getProgressMonitor()); } catch (PersistenceException e) { throw new RuntimeException(e); } } return resource; } public String getBaseName() { return baseName; } public void setBaseName(String baseName) { this.baseName = baseName; } public IResourceLocator getLocator() { return locator; } public Class<? extends IResource> getResourceClass() { return this.resourceClass; } public void setLocator(IResourceLocator locator) { this.locator = locator; if (locator != null) { this.baseName = locator.getBaseName(); } } public IResourceFormat getResourceFormat() { return this.resourceFormat; } public boolean isLoaded() { return loaded; } public void unload() { resource = onBeforeUnload(resource); loaded = false; resource = null; resource = onAfterUnload(); } public R load(IProgressMonitor progressMonitor) throws PersistenceException { resource = onBeforeLoad(resource); IResource loadedResource = ApplicationContext.getPersistenceManager().load(locator, resourceFormat, progressMonitor); resource = onAfterLoad(loadedResource); loaded = true; return resource; } R onBeforeLoad(R resource) { return resource; } protected R onAfterLoad(IResource resource) { return (R) resource; } R onBeforeUnload(R resource) { return resource; } R onAfterUnload() { return null; } public boolean isChanged() { return changed; } public void setChanged(boolean changed) { this.changed = changed; } }