/*
* #%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.adapter;
import com.google.common.base.Strings;
import org.gitools.api.ApplicationContext;
import org.gitools.api.persistence.IPersistenceManager;
import org.gitools.api.resource.IResource;
import org.gitools.api.resource.IResourceFormat;
import org.gitools.api.resource.IResourceLocator;
import org.gitools.api.resource.ResourceReference;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.util.List;
public class ResourceReferenceXmlAdapter extends XmlAdapter<ResourceReferenceXmlElement, ResourceReference> {
private final IResourceLocator resourceLocator;
private final List<ResourceReference<? extends IResource>> dependencies;
public ResourceReferenceXmlAdapter(List<ResourceReference<? extends IResource>> dependencies, IResourceLocator resourceLocator) {
super();
this.resourceLocator = resourceLocator;
this.dependencies = dependencies;
}
@Override
public ResourceReference unmarshal(ResourceReferenceXmlElement resourceReference) throws Exception {
String referenceName = resourceReference.getPath();
IResourceLocator referenceLocator = resourceLocator.getReferenceLocator(referenceName);
String extension = resourceReference.getFormat();
if (Strings.isNullOrEmpty(extension)) {
extension = referenceLocator.getExtension();
}
IPersistenceManager pm = ApplicationContext.getPersistenceManager();
IResourceFormat resourceFormat = pm.getFormat(extension, IResource.class);
ResourceReference dependency = new ResourceReference(referenceLocator, resourceFormat);
dependencies.add(dependency);
return dependency;
}
@Override
public ResourceReferenceXmlElement marshal(ResourceReference resourceReference) throws Exception {
if (resourceReference == null) {
return null;
}
// First force all the dependencies to load data into memory
// this is important when we are overwriting a ZIP file
IResource resource = resourceReference.get();
IPersistenceManager pm = ApplicationContext.getPersistenceManager();
if (resourceReference.getLocator() == null) {
// It's a memory instance. Set the resource locator.
String parentName = resourceLocator.getBaseName();
String extension = pm.getDefaultExtension(resourceReference.getResourceClass());
resourceReference.setLocator(resourceLocator.getReferenceLocator(parentName + "-" + resourceReference.getBaseName() + "." + extension));
resourceReference.setChanged(true);
} else if (resourceLocator.isContainer()) {
// It's a ZIP container. Set the resource locator.
String extension = pm.getDefaultExtension(resourceReference.getResourceClass());
resourceReference.setLocator(resourceLocator.getReferenceLocator(resourceReference.getBaseName() + "." + extension));
resourceReference.setChanged(resource.isChanged());
}
dependencies.add(resourceReference);
IResourceLocator referenceLocator = resourceReference.getLocator();
return new ResourceReferenceXmlElement(null, referenceLocator.getName());
}
}