![معدن جام](https://quera.org/qbox/view/nrr8q7mM6U/world-cup-crawler.png)
علی در شبکهای اجتماعی، کانالهایی برای فوتبالیها دارد. او میخواهد برنامهی زمانبندی بازیهای فوتبال پیش رو را در کانالهایش بهصورت خودکار ارسال کند. همچنین، میخواهد پیش از شروع هر بازی، یک پیام یادآوری بهصورت خودکار بفرستد. برای این کار، او باید اطلاعات بازیها را داشته باشد. از شما میخواهیم برنامهای بنویسید که این اطلاعات را از صفحات وب جمعآوری کند.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/169493/) دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
```
world-cup-crawler
├── www
│ ├── ahmad-bin-ali-stadium.html
│ ├── al-bayt-stadium.html
│ ├── al-janoub-stadium.html
│ ├── al-thumama-stadium.html
│ ├── education-city-stadium.html
│ ├── index.html
│ ├── khalifa-international-stadium.html
│ ├── lusail-iconic-stadium.html
│ └── stadium-974.html
├── Country.java
├── HttpHandler.java
├── Match.java
├── Server.java
├── Stadium.java
├── Team.java
├── WorldCupCrawler.java
└── WorldCupCrawlerSampleTest.java
```
## کلاس `Country`
هر نمونه از این کلاس، بیانگر یک کشور است. هر `Country` دارای یک `name` از نوع `String` بوده که بیانگر نام کشور است. این کلاس از قبل بهطور کامل پیادهسازی شده است.
## کلاس `Stadium`
هر نمونه از این کلاس، بیانگر یک استادیوم است. هر `Stadium` دارای ویژگیهای زیر است:
+ نام (`name`) از نوع `String`
+ کشور (`country`) از نوع `Country`
+ ظرفیت (`capacity`) از نوع `int`
این کلاس از قبل بهطور کامل پیادهسازی شده است.
## کلاس `Team`
هر نمونه از این کلاس، بیانگر یک تیم است. هر `Team` دارای یک `name` از نوع `String` بوده که بیانگر نام کشور است. این کلاس از قبل بهطور کامل پیادهسازی شده است.
## کلاس `Match`
هر نمونه از این کلاس، بیانگر یک مسابقه است. هر `Match` دارای ویژگیهای زیر است:
+ زمان بازی (`time`) از نوع `Date`
+ گروه (`group`) از نوع `String`
+ تیم میزبان (`team1`) از نوع `Team`
+ تیم میزبان (`team2`) از نوع `Team`
+ استادیوم (`stadium`) از نوع `Stadium`
این کلاس از قبل بهطور کامل پیادهسازی شده است.
## کلاس `WorldCupCrawler`
این کلاس، وظیفهی استخراج اطلاعات بازیها از صفحات وب را برعهده دارد. عملیات استخراج دادهها باید تا حد امکان با استفاده از چند *thread* انجام شود تا سرعت بیشتری داشته باشد. این کلاس در کانستراکتور خود یک آبجمت از نوع `URL` دریافت میکند که بیانگر آدرس صفحهی لیست بازیها است. نمونهای از صفحهی لیست بازیها در فایل `www/index.html` موجود است.
+ متد استاتیک `getStadium` این کلاس را طوری پیادهسازی کنید که با دریافت یک `URL`، اطلاعات یک استادیوم را از `URL` دادهشده استخراج کرده و در قالب یک آبجکت از نوع `Stadium` برگرداند. نمونهای از نحوهی فراخوانی این متد:
```java
WorldCupCrawler.getStadium(new URL("http://localhost/al-bayt-stadium.html"))
```
+ متد `getMatches` را طوری پیادهسازی کنید که با ارسال درخواست به آدرس واردشده در کانستراکتور، اطلاعات بازیها را در قالب یک `List` از `Match`ها برگرداند.
**نکته:** تستهای نمونهی سؤال در کلاس `WorldCupCrawlerSampleTest` موجود هستند. با افزودن *JUnit* به *classpath* پروژه، میتوانید آنها را اجرا کنید. کلاسهای `Server` و `HtttpHandler` نیز جزو کلاسهای کمکی برای تست هستند.
# آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، فایل `WorldCupCrawler.java` را آپلود کنید.