/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.rm;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.logging.Logger;
import org.openflexo.foundation.rm.ExternalResource.ExternalResourceOwner;
import org.openflexo.xmlcode.XMLSerializable;
/**
* Represents a list of resources sharing the same relationship, related to a given resource.
*
* @author sguerin
*
*/
public abstract class ResourceList extends Vector<FlexoResource<FlexoResourceData>> implements XMLSerializable, ExternalResourceOwner {
private static final Logger logger = Logger.getLogger(ResourceList.class.getPackage().getName());
private FlexoResource<? extends FlexoResourceData> relatedResource;
private List<ExternalResource> externalResources;
public ResourceList() {
super();
externalResources = new ArrayList<ExternalResource>();
}
public ResourceList(FlexoResource<? extends FlexoResourceData> relatedResource) {
this();
setRelatedResource(relatedResource);
}
private FlexoProject getProject() {
if (getRelatedResource() != null) {
return getRelatedResource().getProject();
} else {
return null;
}
}
/**
* The resource to which this resource list is connected.
*
* @return
*/
public FlexoResource<? extends FlexoResourceData> getRelatedResource() {
return relatedResource;
}
public void setRelatedResource(FlexoResource<? extends FlexoResourceData> relatedResource) {
this.relatedResource = relatedResource;
}
public List<FlexoResource<FlexoResourceData>> getResources() {
return this;
}
public void setResources(List<FlexoResource<FlexoResourceData>> aVector) {
removeAllElements();
for (FlexoResource<FlexoResourceData> r : aVector) {
addToResources(r);
}
if (getRelatedResource() != null) {
getRelatedResource().getProject().notifyResourceChanged(getRelatedResource());
}
update();
}
public List<FlexoResource<FlexoResourceData>> getSerialisationResources() {
List<FlexoResource<FlexoResourceData>> resources = new ArrayList<FlexoResource<FlexoResourceData>>(size());
for (FlexoResource<FlexoResourceData> resource : this) {
if (!resource.isToBeSerialized() || getProject().getFlexoResource() != null
&& !getProject().getFlexoResource().isInitializingProject() && !resource.checkIntegrity()
|| getProject() != resource.getProject()) {
continue;
}
resources.add(resource);
}
return resources;
}
public void setSerialisationResources(List<FlexoResource<FlexoResourceData>> resources) {
setResources(resources);
}
public void addToSerialisationResources(FlexoResource<FlexoResourceData> resource) {
addToResources(resource);
}
public void removeFromSerialisationResources(FlexoResource<FlexoResourceData> resource) {
removeFromResources(resource);
}
public void addToResources(FlexoResource<FlexoResourceData> resource) {
if (resource.isDeleted()) {
return;
}
if (!contains(resource)) {
add(resource);
if (getProject() != null) {
getProject().notifyResourceChanged(getRelatedResource());
}
update();
}
}
public void removeFromResources(FlexoResource<FlexoResourceData> resource) {
if (contains(resource)) {
remove(resource);
if (getProject() != null) {
getProject().notifyResourceChanged(getRelatedResource());
}
update();
}
}
public List<ExternalResource> getExternalResources() {
List<ExternalResource> returned = new ArrayList<ExternalResource>(externalResources);
for (FlexoResource<?> resource : this) {
if (resource.getProject() != getProject()) {
returned.add(new ExternalResource(resource));
}
}
return returned;
}
public void setExternalResources(List<ExternalResource> externalResources) {
this.externalResources = externalResources;
}
public void addToExternalResources(ExternalResource externalResource) {
if (!externalResources.contains(externalResource)) {
externalResources.add(externalResource);
externalResource.setOwner(this);
}
}
public void removeFromExternalResources(ExternalResource externalResource) {
if (externalResources.contains(externalResource)) {
externalResources.remove(externalResource);
externalResource.setOwner(null);
externalResource.delete();
}
}
@Override
public void externalResourceFound(ExternalResource externalResource, FlexoResource resource) {
addToResources(resource);
removeFromExternalResources(externalResource);
}
@Override
public void externalResourceNotFound(ExternalResource externalResource) {
removeFromExternalResources(externalResource);
externalResource.delete();
}
public abstract void update();
/**
* This method overrides
*
* @see java.util.Vector#equals(java.lang.Object) in order to avoid XMLCoDe to consider an empty vector is equals to an other one, and
* avoid misleading references.
*
* Overrides
* @see java.lang.Object#equals(java.lang.Object)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
return obj == this;
}
@Override
public synchronized int hashCode() {
return super.hashCode();
}
public abstract String getSerializationIdentifier();
}