package de.hhaalo.spandisc;
import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.Arrays;
public class Splitter implements ISplitter
{
public IMedium splitter(IMedium srcdata)
{
- return new Medium();
+ IMedium disc = splitterToDisc(srcdata, new CanAddFileToMedium());
+ return disc;
}
public IMedium ignore(IMedium srcdata)
{
- return new Medium();
+ IMedium ignore = splitterToDisc(srcdata, new BigFileIgnoreMedium());
+ return ignore;
}
- public IMediumCollection splitAll(IMedium srcdatia)
+ public IMediumCollection splitAll(IMedium srcdata)
{
- return new MediumCollection();
+ IMediumCollection col = new MediumCollection();
+
+ ArrayList<IMedium> medien = new ArrayList<IMedium>();
+
+ IMedium ignoredisc = ignore(srcdata);
+ if (ignoredisc.getFileSizeArray().length > 0)
+ medien.add(ignoredisc);
+
+ while (srcdata.getFileSizeArray().length > 0) {
+ srcdata.setNr(srcdata.getNr() + 1);
+ medien.add(splitter(srcdata));
+ }
+
+ col.setMediumArray(new IMedium[medien.size()]);
+ medien.toArray(col.getMediumArray());
+
+ return col;
+ }
+
+ private IMedium splitterToDisc(IMedium srcdata, IAddFileToMedium check)
+ {
+ Arrays.sort(srcdata.getFileSizeArray(), new CompareFileSizeBySize());
+
+ IMedium disc = new Medium();
+ disc.setNr(srcdata.getNr());
+ disc.setFreeSpace(srcdata.getFreeSpace());
+
+ ArrayList<IFileSize> restfiles = new ArrayList<IFileSize>();
+ ArrayList<IFileSize> discfiles = new ArrayList<IFileSize>();
+
+ for (int i = 0; i < srcdata.getFileSizeArray().length; i++) {
+ if (check.canAdd(disc, srcdata.getFileSizeArray()[i]))
+ discfiles.add(srcdata.getFileSizeArray()[i]);
+ else
+ restfiles.add(srcdata.getFileSizeArray()[i]);
+ }
+
+ srcdata.setFileSizeArray(new IFileSize[restfiles.size()]);
+ restfiles.toArray(srcdata.getFileSizeArray());
+
+ Arrays.sort(disc.getFileSizeArray(), new CompareFileSizeByName());
+
+ disc.setFileSizeArray(new IFileSize[discfiles.size()]);
+ discfiles.toArray(disc.getFileSizeArray());
+
+ return disc;
}
private class CompareFileSizeBySize implements Comparator<IFileSize>
}
}
+ private class CompareFileSizeByName implements Comparator<IFileSize>
+ {
+ public int compare(IFileSize a, IFileSize b)
+ {
+ return a.getName().compareTo(b.getName());
+ }
+ }
+
private class BigFileIgnoreMedium implements IAddFileToMedium
{
- public int canAdd(IMedium disc, IFileSize file)
+ public boolean canAdd(IMedium disc, IFileSize file)
{
- int retvalue = 0;
+ boolean retvalue = false;
long filesize = (file.getFileSize() / 2048L) * 2048L;
if (disc.getFreeSpace() < filesize)
- retvalue = 1;
+ retvalue = true;
return retvalue;
}
private class CanAddFileToMedium implements IAddFileToMedium
{
- public int canAdd(IMedium disc, IFileSize file)
+ public boolean canAdd(IMedium disc, IFileSize file)
{
- int retvalue = 0;
+ boolean retvalue = false;
long filesize = (file.getFileSize() / 2048L) * 2048L;
if (disc.getFreeSpace() >= filesize) {
disc.setFreeSpace(disc.getFreeSpace() - filesize);
- retvalue = 1;
+ retvalue = true;
}
return retvalue;