/*
* Copyright 2011 Uwe Krueger.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mandelsoft.mand.util;
import java.util.Collection;
import java.util.Iterator;
import com.mandelsoft.mand.QualifiedMandelName;
import com.mandelsoft.util.IteratedIteratorSupport;
import com.mandelsoft.util.Utils;
/**
*
* @author Uwe Krüger
*/
public abstract class ArrayMandelListFolder
extends ArrayBaseList<MandelListFolder> implements MandelListFolder {
private MandelListFolder parent;
private String name;
private QualifiedMandelName thumb;
private MandelList list;
private String identifier;
private static int cnt=0;
public ArrayMandelListFolder(String name)
{
this.name=name;
this.list=createMandelList();
identifier=Utils.getObjectIdentifier(this,++cnt);
}
public boolean containsTransitively(MandelListFolder f)
{
if (f==this) return true;
for (MandelListFolder sub :this) {
if (sub.containsTransitively(f)) return true;
}
return false;
}
public boolean containsTransitively(MandelList l)
{
if (getMandelList()==l) return true;
for (MandelListFolder f :this) {
if (f.containsTransitively(l)) return true;
}
return false;
}
@Override
public boolean add(MandelListFolder f)
{ boolean b=false;
if (!contains(f)){
b=super.add(f);
if (b) {
f.setParent(this);
}
else {
// System.out.println(getName()+" ignored "+f.getName());
}
}
else {
// System.out.println(getName()+" already contains "+f.getName());
}
return b;
}
@Override
public void add(int index, MandelListFolder f)
{
if (!contains(f)){
super.add(index, f);
f.setParent(this);
}
}
@Override
public boolean addAll(Collection<? extends MandelListFolder> c)
{
boolean add=false;
for (MandelListFolder n:c) add|=add(n);
return add;
}
@Override
public boolean addAll(int index,
Collection<? extends MandelListFolder> c)
{
boolean add=false;
for (MandelListFolder n:c) {
if (!contains(n)) {
add(index++,n);
add=true;
}
}
return add;
}
public boolean isLocalFolder(MandelListFolder f)
{
MandelListFolder folder=this;
while (folder.getParent()!=null) folder=folder.getParent();
while (f!=null && f!=folder) f=f.getParent();
return f==folder;
}
@Override
public boolean remove(Object o)
{ boolean b=false;
if (contains(o)) {
b=super.remove(o);
MandelListFolder f=(MandelListFolder)o;
f.setParent(null);
}
return b;
}
@Override
public MandelListFolder remove(int index)
{
MandelListFolder f=super.remove(index);
f.setParent(null);
return f;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public QualifiedMandelName getThumbnailName()
{
return thumb;
}
public void setThumbnailName(QualifiedMandelName thumb)
{
this.thumb=thumb;
}
public String getPath()
{
if (getParent()==null) return getName();
StringBuffer sb=new StringBuffer();
getPath(sb,getParent());
sb.append("/");
sb.append(getName());
return sb.toString();
}
private void getPath(StringBuffer sb, MandelListFolder f)
{
if (f.getParent()!=null) {
getPath(sb,f.getParent());
sb.append("/");
}
sb.append(f.getName());
}
public MandelListFolder getSubFolder(String name)
{
for (MandelListFolder f:this) {
if (f.getName().equals(name)) return f;
}
return null;
}
public boolean isLeaf()
{
return false;
}
public MandelListFolder getParent()
{
return parent;
}
abstract protected MandelList createMandelList();
public void setParent(MandelListFolder f)
{
if (parent!=f) {
if (parent!=null) parent.remove(this);
parent=f;
//if (parent!=null) parent.add(this);
}
}
public MandelList getMandelList()
{
return list;
}
public boolean hasMandelList()
{
return getMandelList()!=null;
}
static private class MandelListFolderIterator extends IteratedIteratorSupport<MandelListFolder, MandelListFolder> {
public MandelListFolderIterator(MandelListFolder folder)
{
super(folder, folder.iterator());
}
@Override
protected Iterator<MandelListFolder> _getIterator(MandelListFolder src)
{
return src.allfolders().iterator();
}
}
static private class AllIterator extends
IteratedIteratorSupport<QualifiedMandelName,MandelListFolder> {
public AllIterator(Iterator<MandelListFolder> folders)
{
super(null,folders);
setup();
}
@Override
protected Iterator<QualifiedMandelName> _getIterator(MandelListFolder src)
{
if (src.getMandelList()==null) return null;
return src.getMandelList().iterator();
}
}
public Iterable<QualifiedMandelName> allentries()
{
return new Iterable<QualifiedMandelName>() {
public Iterator<QualifiedMandelName> iterator()
{ return new AllIterator(new MandelListFolderIterator(ArrayMandelListFolder.this));
}
};
}
public Iterable<MandelListFolder> allfolders()
{
return new Iterable<MandelListFolder>() {
public Iterator<MandelListFolder> iterator()
{
return new MandelListFolderIterator(ArrayMandelListFolder.this);
}
};
}
////////////////////////////////////////////////////////////////////////
private PropertyBag properties=new PropertyBag();
public void setProperty(String name, String value)
{
properties.setProperty(name, value);
}
public Iterable<String> propertyNames()
{
return properties.propertyNames();
}
public String getProperty(String name)
{
return properties.getProperty(name);
}
////////////////////////////////////////////////////////////////////////
@Override
public String toString()
{
return getName()+" ("+identifier+"): "+
Utils.getObjectIdentifier(getMandelListFolderTree());
}
}