Комментирование кода

master
Филиппов Александр 2017-12-07 16:24:46 +07:00
parent 951ac955ed
commit 0b414fa175
8 changed files with 101 additions and 97 deletions

View File

@ -3,6 +3,13 @@
<component name="ChangeListManager">
<list default="true" id="6452b13b-5b16-420c-9e2d-0c40791a2ae8" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ErrorResponse.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ErrorResponse.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java" afterPath="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java" />
</list>
<ignored path="$PROJECT_DIR$/out/" />
<ignored path="$PROJECT_DIR$/target/" />
@ -80,11 +87,11 @@
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="EmailBookController.java" pinned="false" current-in-tab="false">
<file leaf-file-name="EmailBookController.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="68" column="19" lean-forward="false" selection-start-line="68" selection-start-column="19" selection-end-line="68" selection-end-column="19" />
<state relative-caret-position="289">
<caret line="49" column="47" lean-forward="true" selection-start-line="49" selection-start-column="47" selection-end-line="49" selection-end-column="47" />
<folding>
<element signature="imports" expanded="true" />
</folding>
@ -92,26 +99,6 @@
</provider>
</entry>
</file>
<file leaf-file-name="ExceptionControllerAdvice.java" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="22" column="0" lean-forward="true" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="application.properties" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/resources/application.properties">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="23" lean-forward="false" selection-start-line="2" selection-start-column="23" selection-end-line="2" selection-end-column="23" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
@ -136,16 +123,16 @@
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/emailBook.java" />
<option value="$PROJECT_DIR$/src/main/resources/log4j.properties" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/BookStatus.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ErrorResponse.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java" />
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/src/main/resources/banner.txt" />
<option value="$PROJECT_DIR$/src/main/resources/application.properties" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ErrorResponse.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java" />
</list>
</option>
</component>
@ -222,7 +209,6 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="PackagesPane" />
<pane id="ProjectPane">
<subPane>
@ -269,6 +255,7 @@
</subPane>
</pane>
<pane id="Scratches" />
<pane id="Scope" />
<pane id="AndroidView" />
</panes>
</component>
@ -481,7 +468,14 @@
<option name="project" value="LOCAL" />
<updated>1512623307696</updated>
</task>
<option name="localTasksCounter" value="12" />
<task id="LOCAL-00012" summary="Стабильный релиз">
<created>1512623415230</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1512623415230</updated>
</task>
<option name="localTasksCounter" value="13" />
<servers />
</component>
<component name="TodoView">
@ -506,7 +500,7 @@
<window_info id="Version Control" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.23529412" sideWeight="0.4890625" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32941177" sideWeight="0.4978678" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.21801706" sideWeight="0.49441788" order="0" side_tool="false" content_ui="combo" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22228146" sideWeight="0.49441788" order="0" side_tool="false" content_ui="combo" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
@ -581,7 +575,7 @@
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="2" />
<option name="time" value="4" />
</breakpoint-manager>
<watches-manager />
</component>
@ -624,9 +618,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="23" column="85" lean-forward="false" selection-start-line="23" selection-start-column="85" selection-end-line="23" selection-end-column="85" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<folding />
</state>
</provider>
</entry>
@ -666,9 +658,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="6" column="50" lean-forward="false" selection-start-line="6" selection-start-column="50" selection-end-line="6" selection-end-column="50" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<folding />
</state>
</provider>
</entry>
@ -708,9 +698,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="6" column="50" lean-forward="true" selection-start-line="6" selection-start-column="50" selection-end-line="6" selection-end-column="50" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<folding />
</state>
</provider>
</entry>
@ -761,9 +749,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="29" column="5" lean-forward="false" selection-start-line="29" selection-start-column="5" selection-end-line="29" selection-end-column="5" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<folding />
</state>
</provider>
</entry>
@ -804,9 +790,7 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459">
<caret line="27" column="75" lean-forward="true" selection-start-line="27" selection-start-column="75" selection-end-line="27" selection-end-column="75" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<folding />
</state>
</provider>
</entry>
@ -873,21 +857,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="357">
<caret line="27" column="5" lean-forward="false" selection-start-line="27" selection-start-column="5" selection-end-line="27" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/banner.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
@ -903,20 +872,18 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="47" column="66" lean-forward="true" selection-start-line="47" selection-start-column="66" selection-end-line="47" selection-end-column="66" />
<folding>
<element signature="imports" expanded="false" />
</folding>
<caret line="8" column="32" lean-forward="false" selection-start-line="8" selection-start-column="32" selection-end-line="8" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/Main.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="6" column="13" lean-forward="false" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" />
<state relative-caret-position="136">
<caret line="13" column="37" lean-forward="false" selection-start-line="13" selection-start-column="37" selection-end-line="13" selection-end-column="37" />
<folding />
</state>
</provider>
@ -929,29 +896,45 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="68" column="19" lean-forward="false" selection-start-line="68" selection-start-column="19" selection-end-line="68" selection-end-column="19" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ErrorResponse.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
<caret line="2" column="37" lean-forward="false" selection-start-line="2" selection-start-column="37" selection-end-line="2" selection-end-column="37" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/ExceptionControllerAdvice.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailRecord.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="36" lean-forward="false" selection-start-line="6" selection-start-column="36" selection-end-line="6" selection-end-column="36" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailException.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="30" lean-forward="false" selection-start-line="2" selection-start-column="30" selection-end-line="2" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBook.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="324">
<caret line="72" column="23" lean-forward="false" selection-start-line="72" selection-start-column="23" selection-end-line="72" selection-end-column="23" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/cft/task/restServer/EmailBookController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="22" column="0" lean-forward="true" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
<folding />
<caret line="49" column="47" lean-forward="true" selection-start-line="49" selection-start-column="47" selection-end-line="49" selection-end-column="47" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>

View File

@ -7,13 +7,16 @@ import java.util.Map;
@Component
public class EmailBook {
private Map<Long, EmailRecord> book;
private Map<Long, EmailRecord> book; // Внутренний массив записей
public EmailBook() {
// Массив, хешем в котором будет id записи для быстрого поиска
book = new HashMap<>();
}
// Добавление записи в массив
public EmailRecord addEmailRecord(long id, String name, String email) throws EmailException {
// ПРоверка на уникальность email
for (Map.Entry<Long, EmailRecord> rec : book.entrySet()) {
if (rec.getValue().getEmail().equalsIgnoreCase(email)) {
throw new EmailException("Запись с {email = " + email + "} уже есть в базе");
@ -21,10 +24,12 @@ public class EmailBook {
}
EmailRecord new_rec = new EmailRecord(id, name, email);
book.put(id, new_rec);
return new_rec;
return new_rec; // Возвращаем новую добавленную запись
}
// Удаление записи из массива
public boolean removeEmailRecord(long id) throws EmailException {
// Ищем по id, если не найдено бросаем исключение
if (book.containsKey(id)) {
book.remove(id);
return true;
@ -32,10 +37,12 @@ public class EmailBook {
throw new EmailException("Запись с {id = " + id + "} не найдена");
}
// Просто считаем кол-во записей массива
public int count() {
return book.size();
}
// Поиск записи по id
public EmailRecord findRecordById(long id) throws EmailException {
if (book.containsKey(id)) {
return book.get(id);
@ -43,6 +50,7 @@ public class EmailBook {
throw new EmailException("Запись с {id = " + id + "} не найдена");
}
// Поиск записи по имени
public EmailRecord findRecordByName(String name) throws EmailException {
for (Map.Entry<Long, EmailRecord> rec : book.entrySet()) {
if (rec.getValue().getName().equalsIgnoreCase(name)) {
@ -52,6 +60,7 @@ public class EmailBook {
throw new EmailException("Запись с {name = " + name + "} не найдена");
}
// Поиск записи по почте
public EmailRecord findRecordByEmail(String email) throws EmailException {
for (Map.Entry<Long, EmailRecord> rec : book.entrySet()) {
if (rec.getValue().getEmail().equalsIgnoreCase(email)) {
@ -61,6 +70,7 @@ public class EmailBook {
throw new EmailException("Запись с {email = " + email + "} не найдена");
}
// Изменение записи
public EmailRecord editRecord(long id, String name, String email) throws EmailException {
if (book.containsKey(id)) {
if (!name.isEmpty()) {

View File

@ -10,15 +10,16 @@ import org.springframework.web.bind.annotation.*;
import java.util.concurrent.atomic.AtomicLong;
@RestController
@RequestMapping(value = "/")
@RequestMapping(value = "/") // Единая точка входа /
public class EmailBookController {
private static final Logger logger = LoggerFactory.getLogger(EmailBookController.class);
private final AtomicLong new_id = new AtomicLong();
private final AtomicLong new_id = new AtomicLong(); // секвенция для id записей
@Autowired
private EmailBook emailBook;
// Точка входа для создания записи (метод POST )
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<EmailRecord> addEmailRec(@RequestParam(value = "name") String name,
@RequestParam(value = "email") String email) throws EmailException {
@ -26,23 +27,26 @@ public class EmailBookController {
return new ResponseEntity<EmailRecord>(emailBook.addEmailRecord(new_id.incrementAndGet(), name, email), HttpStatus.OK);
}
// Точка входа для поиска записи (метод GET )
// приоритет id -> email -> name
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<EmailRecord> findEmailRec(@RequestParam(value = "id", required = false) String id,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "email", required = false) String email
) throws EmailException {
logger.warn("Method GET: {id = " + id + ", name = " + name + ", email = " + email + "}");
if (name != null && !name.isEmpty()) {
return new ResponseEntity<EmailRecord>(emailBook.findRecordByName(name), HttpStatus.OK);
if (id != null && !id.isEmpty()) {
return new ResponseEntity<EmailRecord>(emailBook.findRecordById(Long.valueOf(id)), HttpStatus.OK);
} else if (email != null && !email.isEmpty()) {
return new ResponseEntity<EmailRecord>(emailBook.findRecordByEmail(email), HttpStatus.OK);
} else if (id != null && !id.isEmpty()) {
return new ResponseEntity<EmailRecord>(emailBook.findRecordById(Long.valueOf(id)), HttpStatus.OK);
} else if (name != null && !name.isEmpty()) {
return new ResponseEntity<EmailRecord>(emailBook.findRecordByName(name), HttpStatus.OK);
} else {
throw new EmailException("Задайте параметр для поиска");
}
}
// Точка входа для изменения записи (метод PUT )
@RequestMapping(method = RequestMethod.PUT)
public ResponseEntity<EmailRecord> editEmailRec(@RequestParam(value = "id", required = true) String id,
@RequestParam(value = "name") String name,
@ -52,6 +56,7 @@ public class EmailBookController {
return new ResponseEntity<EmailRecord>(emailBook.editRecord(Long.valueOf(id), name, email), HttpStatus.OK);
}
// Точка входа для удаления записи (метод DELETE, путь /delete/{id})
@RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
public ResponseEntity<ErrorResponse> removeEmailRec(@PathVariable(value = "id") long id) throws EmailException {
logger.warn("Method DELETE: {id = " + id + "}");
@ -61,9 +66,10 @@ public class EmailBookController {
message.setMessage("Запись {id = " + id + "} успешно удалена");
return new ResponseEntity<ErrorResponse>(message, HttpStatus.OK);
}
return null;
return null; // Просто заглушка, сюда не должно дойти - или успешно удалиться или вызовется исключение
}
// Точка входа для вывода кол-ва записей (метод GET, путь /count)
@RequestMapping(value = "/count", method = RequestMethod.GET)
public int countEmailRecords() {
logger.warn("Method GET: count");

View File

@ -1,5 +1,6 @@
package ru.cft.task.restServer;
// Класс исключения для работы
public class EmailException extends Exception {
private static final long serialVersionUID = 1L;

View File

@ -1,9 +1,10 @@
package ru.cft.task.restServer;
// Класс записи
public class EmailRecord {
private long id;
private String name;
private String email;
private long id; // id записи
private String name; // Имя
private String email; // почта
public EmailRecord(long id, String name, String email) {
this.id = id;

View File

@ -1,5 +1,6 @@
package ru.cft.task.restServer;
// Класс описания возвращаемой ошибки
public class ErrorResponse {
private int errorCode;
private String message;

View File

@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
public class ExceptionControllerAdvice {
private static final Logger logger = LoggerFactory.getLogger(EmailBookController.class);
// Класс для хендлеров исключений
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) {
ErrorResponse error = new ErrorResponse();

View File

@ -6,6 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
// Создание и запуска Spring boot приложения
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}