]> gitweb.hhaalo.de Git - discspan-java.git/commitdiff
add: implementation of splitter
authorBastian Dehn <hhaalo@arcor.de>
Fri, 4 Feb 2022 17:59:24 +0000 (18:59 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Fri, 4 Feb 2022 17:59:24 +0000 (18:59 +0100)
src/de/hhaalo/spandisc/IAddFileToMedium.java
src/de/hhaalo/spandisc/Splitter.java

index f3e5d38085efe18f827df76dc35b682c4e322608..c3b931e105c8d8810a4e67472ae7976f68ad1f47 100644 (file)
@@ -2,5 +2,5 @@ package de.hhaalo.spandisc;
 
 public interface IAddFileToMedium
 {
-       public int canAdd(IMedium disc, IFileSize file);
+       public boolean canAdd(IMedium disc, IFileSize file);
 }
index c0eaca0a343e0de6aee7db730364f02f09cca107..10878dda90c281d3d8020e64bfd4954f15472443 100644 (file)
@@ -1,22 +1,71 @@
 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>
@@ -34,15 +83,23 @@ public class Splitter implements ISplitter
                }
        }
 
+       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;
                }
@@ -50,15 +107,15 @@ public class Splitter implements ISplitter
 
        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;