نیمبو درایو


  • در این سوال به هر بخش از سوال که پاسخ بدهید نمره همان قسمت را خواهید گرفت
  • این سوال را باید با زبان جاوا پاسخ دهید. دقت کنید که انتظار نمی‌رود که همه مفاهیم را از ابتدا بلد باشید و ممکن است بسته به توانایی خود نیاز به جست‌و‌جو کردن داشته باشید.

قرار است در نیمبو یک فضای ابری برای ذخیره سازی فایل‌ها به اسم NimboDrive بسازیم! کلاس‌ها و توابع اولیه این برنامه را نوشته ایم اما این وظیفه شماست که آن‌ها را پیاده‌سازی و کامل کنید.

فایل‌های اولیه پروژه را از اینجا دانلود کنید.

دقت کنید که نیازی نیست کل کارهای گفته شده در یک قسمت را انجام دهید تا نمره آن قسمت را بگیرید. در هر قسمت هر بخشی را که پیاده‌سازی کنید، نمره همان بخش را خواهیدگرفت. نحوه آپلود جواب در انتهای سوال آورده شده است.


قسمت اول🔗

در این قسمت شما باید کلاس UserStorageRepository را پیاده‌سازی کنید. این کلاس مدیریت می‌کند که هر کاربر چقدر حجم برای ذخیره سازی فایل در سیستم ما دارد. این کلاس برای این‌کار در داخل خود یک Map از اسم کاربر و حجم دارد. برای مثال در خود ذخیره می‌کند که کاربری به اسم Ali می‌تواند 125000 بایت دیگر در سیستم فایل آپلود کند.

توابع گفته شده در زیر را پیاده‌سازی کنید. (روی عنوان هر کار کلیک کنید تا توضیحات آن باز شود.)

تابع increaseStorageOfUser

این تابع اسم کاربر و یک عدد گرفته و میزان حجم کاربر را به اندازه عدد داده شده زیاد می‌کند. اگر کاربر از قبل در Map وجود نداشته باشد آن را اضافه می‌کند و حجم آن را برابر با مقدار داده شده قرار می‌دهد.

تابع hasStorage

این تابع اسم کاربر و یک عدد گرفته و بررسی می‌کند آیا کاربر به اندازه داده شده حجم دارد یا نه. اگر کاربر کلا وجود نداشته باشد باید false‍ برگردانده شود.

تابع decreaseStorageOfUser

این تابع اسم کاربر و یک عدد گرفته و حجم کاربر را به آن اندازه کم می‌کند. اگر حجم کاربر به صفر رسید یا منفی شد، آن کاربر از Map حذف می‌شود.


قسمت دوم🔗

کلاس NimboFile یک فایل را در سیستم ما مشخص می‌کند. این کلاس، زیرکلاس‌هایی(مثل TextFile) دارد که نوع فایل را مشخص می‌کنند. هر فایل یک اسم(مثلا readme.txt)، یک پوشه (مثلا /user/ali/) ، یک مالک (مثلا Ali) و یک عدد به عنوان حجم دارد که واحد آن بایت است.

کلاس FileRepository کلاس اصلی برای مدیریت فایل‌هاست که در آن کل فایل‌ها و اطلاعات آنها ذخیره می‌شود.

شما باید کارهای گفته شده در زیر را انجام دهید.

نوشتن متد toString برای NimboFile

در کلاس NimboFile متد toString را override کنید به طوری که اسم کامل فایل(مثلا a.txt) را برگرداند.

پیاده‌سازی تابع addFile‍ در کلاس FileRepository

این تابع یک فایل به عنوان ورودی می‌گیرد و اگر مالک فایل به اندازه کافی حجم داشته باشد، فایل را به مجموعه فایل‌های ذخیره شده اضافه می‌کند و به اندازه حجم فایل از فضای مالک کم می‌کند. اگر مالک فایل به اندازه کافی حجم نداشته باشد باید یک استنا از نوع IllegalArgumentException پرتاب کنید.

درون این کلاس یک شی از جنس UserStorageRepository وجود دارد که برای کم‌کردن حجم از کاربر باید از آن استفاده کنید.

پیاده‌سازی تابع searchByName در کلاس FileRepository

این تابع یک رشته دریافت کرده و لیست تمام فایل‌هایی که رشته داده شده در اسم آن‌ها تکرار شده‌است را بر می‌گرداند. دقت کنید که فرمت فایل نباید در جست و جو در نظر گرفته شود. برای مثال اگر اسم فایل a.txt باشد و xt را سرچ کنیم، این فایل نباید برگرداننده شود. جست و جو حساس به حروف بزرگ و کوچک نیست.

پیاده‌سازی تابع scan در کلاس FileRepository

یک شئ در این کلاس به اسم scanner وجود دارد. این شئ یک تابع به اسم scanFile دارد که یک فایل ورودی میگیرد و اگر فایل ویروسی باشد یک اکسپشن پرت میکند. این تابع به کمک این شئ تمام فایل‌ها را اسکن می‌کند و فایل‌هایی که عادی نیستند را از مجموعه فایل‌ها حذف می‌کند و حجم آن‌ها را به مالکان فایل‌ها بر می‌گرداند.


قسمت سوم🔗

برنامه ما این قابلیت را دارد که بعضی از انواع فایل‌ها را بدون دانلود به صورت پیش‌نمایش به کاربر نشان دهد. فایلی که این قابلیت را دارد واسط hasPreview را پیاده‌سازی می‌کند.

اضافه کردن پیش‌نمایش به کلاس TextFile

کلاس TextFile را عوض کنید به گونه‌ای که اینترفیسِ HasPreview<String> را پیاده‌سازی کند.دقت کنید که نیازی نیست در این بخش تابع preview‍ را هم پیاده‌سازی کنید. برای سادگی فعلاً می‌توانید در آن return null; بگذارید.

پیاده‌سازی تابع isPreviewable در کلاس FileRepository

این تابع یک فایل می‌گیرد و اگر فایل داده شده اینترفیسِ HasPreview را پیاده‌سازی کرده باشد (یا به عبارت دیگر از جنس HasPreview باشد ) true بر می‌گرداند.

پیاده‌سازی تابع sort‍ در کلاس FileRepository

این تابع یک Comparator ‍به عنوان ورودی می‌گیرد و فایل‌ها را با توجه به آن مرتب کرده به صورت آرایه بر می‌گرداند.


قسمت چهارم🔗

پیاده‌سازی تابع findLongestMediaInDirectory در کلاس FileRepository

این تابع آدرس یک پوشه را می‌گیرد(مثلا /home/ali/) و طولانی‌ترین فایل درون آن پوشه که از جنس MediaFile باشد را درون یک Optional‍ گذاشته و برمی‌گرداند. طولانی‌ترین فایل، فایلی است که duration آن از همه بیش‌تر باشد. اگر در آن پوشه هیج فایل مدیایی وجود نداشته باشد ‍Optional.empty() برگردانده می‌شود. هم‌چنین اگر چندین فایل با طول یکسان وجود داشت یکی از آنها به دلخواه باید برگرداننده شود.

پیاده‌سازی پیش‌نمایش برای کلاس TextFile

در قسمت قبل کلاس TextFile را عوض کردید به گونه‌ای که اینترفیسِ HasPreview<String> را پیاده‌سازی کند. در این بخش باید تابع preview را در این کلاس پیاده‌سازی کنید. این تابع یک InputStream که مربوط به این فایل متنی است را دریافت می‌کند و باید خط اول آن را بخواند و رشته خوانده شده را در کلاس Preview قرار دهد و آن را برگرداند.

پیاده‌سازی تابع applyToAllByFilter در کلاس FileRepository

این تابع یک فیلتر و یک تابع به عنوان ورودی گرفته و تابع گرفته شده را روی تمامی فایل‌هایی که با فیلتر مطابقت دارند(فیلتر به ازای آنها true برمیگرداند) اعمال می‌کند.


نکات🔗

  • یک فایل به اسم SampleMain.java به شما داده شده است تا با نحوه ی کارکردن کلاس‌ها آشنا شوید و استفاده دیگری ندارد.
  • به هیچ وجه امضای توابع داده شده یا متغیر های درونی هر کلاس را عوض نکنید. تغییر اسم تابع، نوع برگشتی، پارامترها و ... باعث می‌شود کد شما داوری نشود.
  • دقت کنید حتی اگر بعضی از فایل‌ها را هنوز دست نزده‌اید باز هم باید آنها را مطابق الگوی زیر آپلود کنید تا کد شما کامپایل شود و مورد داوری قرارگیرد.

چیزی که باید آپلود کنید: یک فایل زیپ دقیقاً مشابه فایلی که دریافت کردید، یعنی وقتی آن را باز می‌کنیم پوشه in را ببینیم. داخل پوشه in باید پوشه nimbo قرار گرفته باشد. داخل پوشه nimbo هم باید پوشه‌های file و preview و فایل‌های UserStorageRepository.java و FileRepository.java و FileScanner.java قرار گرفته باشند. درون پوشه‌های file و preview نیز باید فایل‌های مرتبط موجود باشند. اسم فایل زیپ مهم نیست. ساختاری مشابه شکل زیر:

yourZipFileName.zip
└── in
    └── nimbo
        ├── file
        │   ├── BinaryFile.java
        │   ├── MediaFile.java
        │   ├── NimboFile.java
        │   └── TextFile.java
        ├── FileRepository.java
        ├── FileScanner.java
        ├── preview
        │   ├── hasPreview.java
        │   └── Preview.java
        ├── SampleMain.java
        └── UserStorageRepository.java
Plain text