implemented web UI for managing multiple proxy servers instances

master
Vyacheslav N. Boyko 2018-10-27 19:09:38 +03:00
parent 0119a00d35
commit f18c78d892
30 changed files with 2773 additions and 190 deletions

4
.gitignore vendored
View File

@ -1 +1,3 @@
target/**
target/**
db/**
.ideaDataSources/**

1091
jProxy.ipr

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="27bd0fac-9043-4d05-8780-09e69fc6f7ca" name="Default Changelist" comment="" />
<list default="true" id="27bd0fac-9043-4d05-8780-09e69fc6f7ca" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JproxyApp.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/beans/ProxyInstanceList.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/config/SecurityConfig.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/IndexController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyListController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/ProxyInstance.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/dtos/ProxyInstanceDTO.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/exceptions/ProxyAlreadyEnabled.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/MappingConfiguration.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/repositories/ProxyInstanceRepository.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyInstanceService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyManagerService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/application.properties" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/decorators/footer.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/decorators/header.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/decorators/proxyForm.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/logout.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/proxyForm.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/resources/templates/proxylist.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jProxy.ipr" beforeDir="false" afterPath="$PROJECT_DIR$/jProxy.ipr" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jProxy.iws" beforeDir="false" afterPath="$PROJECT_DIR$/jProxy.iws" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jproxy.iml" beforeDir="false" afterPath="$PROJECT_DIR$/jproxy.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ClientListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ClientListener.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JProxy.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ProxyServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ProxyServer.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java" afterDir="false" />
</list>
<ignored path="$PROJECT_DIR$/out/" />
<ignored path="$PROJECT_DIR$/target/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
@ -10,6 +41,36 @@
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="DatabaseView">
<option name="SHOW_INTERMEDIATE" value="true" />
<option name="GROUP_DATA_SOURCES" value="true" />
<option name="GROUP_SCHEMA" value="true" />
<option name="GROUP_CONTENTS" value="false" />
<option name="SORT_POSITIONED" value="false" />
<option name="SHOW_EMPTY_GROUPS" value="false" />
<option name="AUTO_SCROLL_FROM_SOURCE" value="false" />
<option name="HIDDEN_KINDS">
<set />
</option>
<expand>
<path>
<item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" />
<item name="jproxy.h2db" type="feb32156:DbDataSourceImpl" />
</path>
<path>
<item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" />
<item name="jproxy.h2db" type="feb32156:DbDataSourceImpl" />
<item name="JPROXY.H2DB: database" type="c8e2528e:H2ImplModel$Database" />
</path>
<path>
<item name="Database" type="3277223f:DatabaseStructure$DbRootGroup" />
<item name="jproxy.h2db" type="feb32156:DbDataSourceImpl" />
<item name="JPROXY.H2DB: database" type="c8e2528e:H2ImplModel$Database" />
<item name="PUBLIC: schema" type="4f7ca4f5:H2ImplModel$Schema" />
</path>
</expand>
<select />
</component>
<component name="FUSProjectUsageTrigger">
<session id="2059998503">
<usages-collector id="statistics.lifecycle.project">
@ -20,26 +81,49 @@
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="dummy" value="7" />
<entry key="java" value="3180" />
<entry key="xml" value="10" />
<entry key="dummy" value="25" />
<entry key="gitignore" value="10" />
<entry key="html" value="1354" />
<entry key="java" value="8519" />
<entry key="properties" value="211" />
<entry key="sql" value="29" />
<entry key="xml" value="46" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="JAVA" value="3180" />
<entry key="PLAIN_TEXT" value="7" />
<entry key="XML" value="10" />
<entry key="Git file" value="10" />
<entry key="HTML" value="1354" />
<entry key="JAVA" value="8519" />
<entry key="PLAIN_TEXT" value="25" />
<entry key="Properties" value="211" />
<entry key="Scratch" value="29" />
<entry key="XML" value="46" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="java" value="9" />
<entry key="TABLES" value="2" />
<entry key="class" value="5" />
<entry key="gitignore" value="2" />
<entry key="html" value="9" />
<entry key="java" value="56" />
<entry key="properties" value="8" />
<entry key="sql" value="5" />
<entry key="xml" value="9" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="JAVA" value="9" />
<entry key="CLASS" value="5" />
<entry key="Database Element" value="2" />
<entry key="Git file" value="2" />
<entry key="HTML" value="9" />
<entry key="JAVA" value="56" />
<entry key="Properties" value="8" />
<entry key="SQL" value="1" />
<entry key="Scratch" value="4" />
<entry key="XML" value="9" />
</counts>
</usages-collector>
</session>
@ -47,19 +131,24 @@
<component name="FileEditorManager">
<leaf>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JProxy.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyManagerService.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="74" selection-start-line="6" selection-start-column="74" selection-end-line="6" selection-end-column="74" />
<state relative-caret-position="375">
<caret line="96" column="32" selection-start-line="96" selection-start-column="32" selection-end-line="96" selection-end-column="32" />
<folding>
<element signature="imports" expanded="true" />
<element signature="e#1060#1061#0" expanded="true" />
<element signature="e#1091#1092#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ClientListener.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ProxyServer.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="155">
<caret line="29" column="30" selection-start-line="29" selection-start-column="30" selection-end-line="29" selection-end-column="30" />
<state relative-caret-position="340">
<caret line="20" selection-start-line="20" selection-end-line="20" />
<folding>
<element signature="imports" expanded="true" />
</folding>
@ -68,10 +157,10 @@
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="197">
<caret line="39" column="21" lean-forward="true" selection-start-line="39" selection-start-column="21" selection-end-line="39" selection-end-column="21" />
<state relative-caret-position="681">
<caret line="48" column="44" selection-start-line="48" selection-start-column="44" selection-end-line="48" selection-end-column="44" />
<folding>
<element signature="imports" expanded="true" />
</folding>
@ -80,12 +169,12 @@
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ProxyServer.java">
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/proxylist.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="319">
<caret line="34" lean-forward="true" selection-start-line="34" selection-end-line="34" />
<state relative-caret-position="324">
<caret line="25" column="58" selection-start-line="25" selection-start-column="58" selection-end-line="25" selection-end-column="58" />
<folding>
<element signature="imports" expanded="true" />
<element signature="n#style#0;n#table#0;n#body#0;n#html#0;n#!!top" expanded="true" />
</folding>
</state>
</provider>
@ -96,19 +185,58 @@
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Interface" />
<option value="Thymeleaf" />
<option value="Class" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>@{</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/App.java" />
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ProxyServer.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JProxy.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ClientListener.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JproxyApp.java" />
<option value="$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java" />
<option value="$PROJECT_DIR$/src/main/resources/templates/index.html" />
<option value="$PROJECT_DIR$/src/main/resources/templates/logout.html" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/IndexController.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/config/SecurityConfig.java" />
<option value="$APPLICATION_CONFIG_DIR$/consoles/db/7ae0f335-055c-49ba-b9a6-1d4331a1015e/console.sql" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/ProxyInstanceConverter.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/MappingConfigurator.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/MappingConfiguration.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/beans/ProxySettingsList.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/dtos/ProxyInstanceDTO.java" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/repositories/ProxyInstanceRepository.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/ProxyInstance.java" />
<option value="$PROJECT_DIR$/src/main/resources/templates/decorators/footer.html" />
<option value="$PROJECT_DIR$/src/main/resources/templates/decorators/header.html" />
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/src/main/resources/application.properties" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyListController.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyInstanceService.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/beans/ProxyInstanceList.java" />
<option value="$PROJECT_DIR$/src/main/resources/templates/proxyForm.html" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/JproxyFactoryService.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/JproxyManagerService.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/exceptions/ProxyAlreadyEnabled.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyController.java" />
<option value="$PROJECT_DIR$/src/main/resources/templates/proxylist.html" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ClientListener.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyManagerService.java" />
<option value="$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ProxyServer.java" />
</list>
</option>
</component>
@ -135,13 +263,12 @@
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="jproxy" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Dependencies" type="f4be9f2a:MavenProjectsStructure$DependenciesNode" />
<item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="jproxy" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Dependencies" type="f4be9f2a:MavenProjectsStructure$DependenciesNode" />
<item name="junit:junit:4.12" type="c0821a7e:MavenProjectsStructure$DependencyNode" />
</path>
</expand>
<select />
@ -152,10 +279,11 @@
<option name="vmOptions" value="-Xmx2048m" />
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="-4" />
<option name="x" value="-7" />
<option name="width" value="1932" />
<option name="height" value="1047" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
@ -170,6 +298,11 @@
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="db" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
@ -200,22 +333,98 @@
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="test" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="beans" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="test" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="config" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="test" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="bvn13" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="controllers" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="engine" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="entities" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="entities" type="462c0819:PsiDirectoryNode" />
<item name="dtos" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="mapping" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="repositories" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="services" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="resources" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="jProxy" type="b2602c69:ProjectViewProjectNode" />
<item name="jproxy" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="resources" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
@ -224,16 +433,34 @@
</panes>
</component>
<component name="PropertiesComponent">
<property name="DatabaseDriversLRU" value="hsqldb&#10;h2" />
<property name="RequestMappingsPanelOrder0" value="0" />
<property name="RequestMappingsPanelOrder1" value="1" />
<property name="RequestMappingsPanelWidth0" value="75" />
<property name="RequestMappingsPanelWidth1" value="75" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="add_unversioned_files" value="true" />
<property name="aspect.path.notification.shown" value="true" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1540269948386" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../ESB-Manager-2.0/ESBManager2-React" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1540656493152" />
<property name="database.console.LAST_STATE" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../jproxy-temp" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="C:/nodejs/node" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="project.structure.last.edited" value="Project" />
<property name="project.structure.last.edited" value="Modules" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.23210071" />
<property name="settings.editor.selected.configurable" value="reference.projectsettings.compiler.javacompiler" />
<property name="settings.editor.selected.configurable" value="preferences.lookFeel" />
</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\dev\my\jproxy\src\main\resources\templates\decorators" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="ru.bvn13.jproxy" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\dev\my\jproxy\src\main" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
@ -247,7 +474,7 @@
</list>
</option>
</component>
<component name="RunManager" selected="Application.JProxy">
<component name="RunManager" selected="Spring Boot.JproxyApp">
<configuration default="true" type="Applet" factoryName="Applet">
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
<method v="2">
@ -260,7 +487,7 @@
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="ru.bvn13.jproxy.*" />
<option name="PATTERN" value="ru.bvn13.jproxy.engine.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
@ -312,6 +539,13 @@
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="JproxyApp" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<module name="jproxy" />
<option name="SPRING_BOOT_MAIN_CLASS" value="ru.bvn13.jproxy.JproxyApp" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="TestNG" factoryName="TestNG">
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
<properties />
@ -333,6 +567,7 @@
<item itemvalue="JUnit.JProxyTest" />
<item itemvalue="JUnit.JProxyTest.testYandex" />
<item itemvalue="Application.JProxy" />
<item itemvalue="Spring Boot.JproxyApp" />
</list>
<recent_temporary>
<list>
@ -352,7 +587,7 @@
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1540038559516</updated>
<workItem from="1540038565897" duration="7977000" />
<workItem from="1540038565897" duration="40147000" />
</task>
<servers />
</component>
@ -389,40 +624,46 @@
</history-entry>
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="7977000" />
<option name="totallyTimeSpent" value="40147000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="Image Layers" />
<window_info id="Designer" />
<window_info id="UI Designer" />
<window_info id="Capture Tool" />
<window_info id="Favorites" side_tool="true" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Messages" />
<window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" weight="0.24222222" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="right" id="Palette" />
<window_info anchor="right" id="Theme Preview" />
<window_info anchor="right" id="Capture Analysis" />
<window_info anchor="right" id="Palette&#9;" />
<window_info anchor="right" id="Database" />
<window_info anchor="right" id="Maven Projects" weight="0.19669509" />
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info id="UI Designer" order="0" />
<window_info id="Favorites" order="1" side_tool="true" />
<window_info id="Capture Tool" order="2" />
<window_info id="Image Layers" order="3" />
<window_info id="Web" order="4" side_tool="true" />
<window_info id="Designer" order="5" />
<window_info content_ui="combo" id="Project" order="6" visible="true" weight="0.20095949" />
<window_info id="Structure" order="7" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="SQL Generator" />
<window_info anchor="bottom" id="Spring" order="0" />
<window_info anchor="bottom" id="Terminal" order="1" />
<window_info anchor="bottom" id="Event Log" order="2" side_tool="true" />
<window_info anchor="bottom" id="Java Enterprise" order="3" />
<window_info anchor="bottom" id="Messages" order="4" />
<window_info anchor="bottom" id="Database Changes" order="5" />
<window_info anchor="bottom" id="Version Control" order="6" show_stripe_button="false" />
<window_info anchor="bottom" id="Message" order="7" />
<window_info anchor="bottom" id="Database Console" order="8" />
<window_info anchor="bottom" id="Find" order="9" />
<window_info anchor="bottom" id="Run" order="10" weight="0.47111112" />
<window_info anchor="bottom" id="Debug" order="11" weight="0.2669633" />
<window_info anchor="bottom" id="Cvs" order="12" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="13" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="14" />
<window_info anchor="right" id="Capture Analysis" order="0" />
<window_info anchor="right" id="Maven Projects" order="1" weight="0.22867803" />
<window_info anchor="right" id="Database" order="2" weight="0.30703625" />
<window_info anchor="right" id="Palette&#9;" order="3" />
<window_info anchor="right" id="Theme Preview" order="4" />
<window_info anchor="right" id="Bean Validation" order="5" />
<window_info anchor="right" id="Palette" order="6" />
<window_info anchor="right" id="Commander" order="7" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="8" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="9" weight="0.25" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -432,16 +673,6 @@
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java</url>
<line>41</line>
<properties />
<option name="timeStamp" value="1" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
<watches-manager>
<configuration name="Application">
<watch expression="new String(buffer)" language="JAVA" />
@ -463,13 +694,6 @@
</expressions>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="17" column="30" selection-start-line="17" selection-start-column="30" selection-end-line="17" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files/Java/jdk1.8.0_162/src.zip!/java/io/DataInputStream.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
@ -484,26 +708,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ProxyServer.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="319">
<caret line="34" lean-forward="true" selection-start-line="34" selection-end-line="34" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="197">
<caret line="39" column="21" lean-forward="true" selection-start-line="39" selection-start-column="21" selection-end-line="39" selection-end-column="21" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JProxy.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
@ -511,10 +715,349 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/ClientListener.java">
<entry file="file://$PROJECT_DIR$/src/test/java/ru/bvn13/JProxyTest.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="155">
<caret line="29" column="30" selection-start-line="29" selection-start-column="30" selection-end-line="29" selection-end-column="30" />
<state relative-caret-position="390">
<caret line="31" column="15" selection-start-line="31" selection-start-column="15" selection-end-line="31" selection-end-column="15" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/springframework/security/spring-security-core/5.0.9.RELEASE/spring-security-core-5.0.9.RELEASE.jar!/org/springframework/security/core/userdetails/User.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="290">
<caret line="152" column="35" selection-start-line="152" selection-start-column="35" selection-end-line="152" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/JproxyApp.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="9" column="39" selection-start-line="9" selection-start-column="39" selection-end-line="9" selection-end-column="39" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$APPLICATION_CONFIG_DIR$/consoles/db/7a4cf63d-15b3-4a13-bd96-e323e735a79d/console.sql">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/logout.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="22" selection-start-line="5" selection-start-column="22" selection-end-line="5" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="29" selection-start-line="8" selection-start-column="29" selection-end-line="8" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/IndexController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="357">
<caret line="21" selection-start-line="21" selection-end-line="21" />
<folding>
<element signature="imports" expanded="true" />
<element signature="e#890#891#0" expanded="true" />
<element signature="e#914#915#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/MappingConfigurator.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="15" column="8" selection-start-line="15" selection-start-column="8" selection-end-line="15" selection-end-column="8" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/ProxyInstanceConverter.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="19" column="12" selection-start-line="19" selection-start-column="12" selection-end-line="19" selection-end-column="12" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/beans.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="18" selection-start-line="5" selection-start-column="18" selection-end-line="5" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/mapping/MappingConfiguration.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="50" selection-start-line="17" selection-start-column="19" selection-end-line="17" selection-end-column="50" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="19" selection-start-line="2" selection-start-column="19" selection-end-line="2" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="das://7ae0f335-055c-49ba-b9a6-1d4331a1015e/database/JPROXY.H2DB/schema/INFORMATION_SCHEMA/table/TABLES.sql">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="17">
<caret line="1" column="13" selection-start-line="1" selection-start-column="13" selection-end-line="1" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="das://7ae0f335-055c-49ba-b9a6-1d4331a1015e/database/JPROXY.H2DB/schema/INFORMATION_SCHEMA/table/TABLES">
<provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
<state>
<filtering enabled="true" />
</state>
</provider>
</entry>
<entry file="file://$APPLICATION_CONFIG_DIR$/consoles/db/7ae0f335-055c-49ba-b9a6-1d4331a1015e/console.sql">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="28" selection-start-column="28" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/springframework/data/spring-data-jpa/2.0.11.RELEASE/spring-data-jpa-2.0.11.RELEASE.jar!/org/springframework/data/jpa/repository/JpaRepository.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="408">
<caret line="32" column="6" selection-start-line="32" selection-start-column="6" selection-end-line="32" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/com/googlecode/jmapper-framework/jmapper-api/1.2.1/jmapper-api-1.2.1.jar!/com/googlecode/jmapper/api/IJMapper.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="15" column="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/decorators/footer.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" selection-start-line="8" selection-end-line="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/decorators/header.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" lean-forward="true" selection-start-line="8" selection-end-line="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="222">
<caret line="45" column="57" selection-start-line="45" selection-start-column="57" selection-end-line="45" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/application.properties">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="23" column="23" lean-forward="true" selection-start-line="23" selection-start-column="23" selection-end-line="23" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.0.10.RELEASE/spring-web-5.0.10.RELEASE.jar!/org/springframework/web/method/support/InvocableHandlerMethod.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="172">
<caret line="127" selection-start-line="127" selection-end-line="127" />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.0.10.RELEASE/spring-aop-5.0.10.RELEASE.jar!/org/springframework/aop/framework/CglibAopProxy.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="490" selection-start-line="490" selection-end-line="490" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/dtos/ProxyInstanceDTO.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="476">
<caret line="28" column="28" selection-start-line="28" selection-start-column="19" selection-end-line="28" selection-end-column="28" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/repositories/ProxyInstanceRepository.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="45" lean-forward="true" selection-start-line="14" selection-start-column="45" selection-end-line="14" selection-end-column="45" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyInstanceService.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="313">
<caret line="35" column="14" lean-forward="true" selection-start-line="35" selection-start-column="14" selection-end-line="35" selection-end-column="14" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/config/SecurityConfig.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="37" column="41" selection-start-line="37" selection-start-column="41" selection-end-line="37" selection-end-column="41" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyListController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="36" selection-start-line="17" selection-start-column="36" selection-end-line="17" selection-end-column="36" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/beans/ProxyInstanceList.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="239">
<caret line="23" column="11" lean-forward="true" selection-start-line="23" selection-start-column="11" selection-end-line="23" selection-end-column="11" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/decorators/proxyForm.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="44" selection-start-line="17" selection-start-column="44" selection-end-line="17" selection-end-column="44" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/proxyForm.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="15" column="7" lean-forward="true" selection-start-line="15" selection-start-column="7" selection-end-line="15" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/entities/ProxyInstance.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="357">
<caret line="21" column="6" selection-start-line="21" selection-start-column="6" selection-end-line="21" selection-end-column="6" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/exceptions/ProxyAlreadyEnabled.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="72" selection-start-line="17" selection-start-column="72" selection-end-line="17" selection-end-column="72" />
<folding>
<element signature="e#353#354#0" expanded="true" />
<element signature="e#382#383#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files/Java/jdk1.8.0_162/src.zip!/java/net/ServerSocket.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-984">
<caret line="126" column="11" selection-start-line="126" selection-start-column="11" selection-end-line="126" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files/Java/jdk1.8.0_162/src.zip!/java/net/InetAddress.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-12000">
<caret line="306" column="4" selection-start-line="306" selection-start-column="4" selection-end-line="306" selection-end-column="4" />
<folding>
<element signature="e#10589#10590#0" expanded="true" />
<element signature="e#10637#10638#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files/Java/jdk1.8.0_162/src.zip!/java/util/concurrent/ExecutorService.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1122">
<caret line="124" column="5" selection-start-line="108" selection-start-column="3" selection-end-line="124" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/controllers/ProxyController.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="681">
<caret line="48" column="44" selection-start-line="48" selection-start-column="44" selection-end-line="48" selection-end-column="44" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/resources/templates/proxylist.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="324">
<caret line="25" column="58" selection-start-line="25" selection-start-column="58" selection-end-line="25" selection-end-column="58" />
<folding>
<element signature="n#style#0;n#table#0;n#body#0;n#html#0;n#!!top" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/services/ProxyManagerService.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="375">
<caret line="96" column="32" selection-start-line="96" selection-start-column="32" selection-end-line="96" selection-end-column="32" />
<folding>
<element signature="imports" expanded="true" />
<element signature="e#1060#1061#0" expanded="true" />
<element signature="e#1091#1092#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ClientListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="969">
<caret line="57" selection-start-line="57" selection-end-line="57" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/ru/bvn13/jproxy/engine/ProxyServer.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="20" selection-start-line="20" selection-end-line="20" />
<folding>
<element signature="imports" expanded="true" />
</folding>
@ -538,7 +1081,7 @@
</state>
<state key="FacetStructureConfigurable.UI">
<settings>
<last-edited>No facets are configured</last-edited>
<last-edited>Spring</last-edited>
<splitter-proportions>
<option name="proportions">
<list>

View File

@ -1,16 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
<facet type="web" name="Web">
<configuration>
<webroots />
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
<root url="file://$MODULE_DIR$/target/generated-sources/annotations" />
</sourceRoots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.10.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.0.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.0.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.34" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.34" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-devtools:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.unbescape:unbescape:1.1.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.13" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:2.7.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: javax.transaction:javax.transaction-api:1.2" level="project" />
<orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.2.17.Final" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jboss:jandex:2.0.3.Final" level="project" />
<orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.0.11.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.0.11.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-orm:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.0.10.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.hsqldb:hsqldb:2.4.1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.h2database:h2:1.4.197" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.jmapper-framework:jmapper-core:1.6.0.1" level="project" />
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:15.0" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.jmapper-framework:jmapper-api:1.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
<orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
<orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
<orderEntry type="library" name="Maven: net.sf.kxml:kxml2:2.3.0" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.22" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.6.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.6.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.6.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.7.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.10.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.10.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.security:spring-security-test:5.0.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.0.9.RELEASE" level="project" />
</component>
</module>

149
pom.xml
View File

@ -1,65 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.bvn13.jproxy</groupId>
<artifactId>jproxy</artifactId>
<version>1.0</version>
<groupId>ru.bvn13.jproxy</groupId>
<artifactId>jproxy</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>jproxy</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<name>jproxy</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.googlecode.jmapper-framework</groupId>
<artifactId>jmapper-core</artifactId>
<version>1.6.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -1,10 +0,0 @@
package ru.bvn13.jproxy;
public class JProxy
{
public static void main( String[] args )
{
ProxyServer server = new ProxyServer(8099, "192.168.199.200", 1122);
}
}

View File

@ -0,0 +1,12 @@
package ru.bvn13.jproxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JproxyApp {
public static void main(String[] args) {
SpringApplication.run(JproxyApp.class, args);
}
}

View File

@ -0,0 +1,36 @@
package ru.bvn13.jproxy.beans;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
import ru.bvn13.jproxy.services.ProxyInstanceService;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* Created by bvn13 on 24.10.2018.
*/
@Component
@RequestScope
public class ProxyInstanceList {
@Autowired
private ProxyInstanceService proxyInstanceService;
@Getter
@Setter
private List<ProxyInstanceDTO> proxyInstances;
// public Set<ProxyInstanceDTO> getProxyInstances() {
// return proxyInstanceService.findAllDTOs();
// }
@PostConstruct
public void init() {
proxyInstances = proxyInstanceService.findAllDTOs();
}
}

View File

@ -0,0 +1,72 @@
package ru.bvn13.jproxy.config;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import javax.servlet.annotation.WebServlet;
/**
* Created by bvn13 on 23.10.2018.
*/
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${jproxy.username}")
private String username;
@Value("${jproxy.password}")
private String password;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
//.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser((Strings.isNotEmpty(username) ? username : "user"))
.password(passwordEncoder().encode((Strings.isNotEmpty(password) ? password : "pass123")))
.roles("USER");
}
// @Bean
// public ServletRegistrationBean h2servletRegistration() {
// ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
// registration.addUrlMappings("/console/*");
// return registration;
// }
}

View File

@ -0,0 +1,33 @@
package ru.bvn13.jproxy.controllers;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created by bvn13 on 23.10.2018.
*/
@Controller
@RequestMapping("/")
public class IndexController {
@GetMapping("/")
public String index(Model model) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
System.out.println("user: "+ auth.getName());
System.out.println("roles: "+ auth.getAuthorities());
model.addAttribute("username", auth.getName());
return "index";
}
@GetMapping("/logout")
public String logout() {
return "logout";
}
}

View File

@ -0,0 +1,53 @@
package ru.bvn13.jproxy.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
import ru.bvn13.jproxy.services.ProxyInstanceService;
import ru.bvn13.jproxy.services.ProxyManagerService;
import java.util.Optional;
/**
* Created by bvn13 on 25.10.2018.
*/
@Controller
@RequestMapping("/proxy/{proxyId:[\\d]+}")
public class ProxyController {
@Autowired
private ProxyInstanceService proxyInstanceService;
@Autowired
private ProxyManagerService proxyManagerService;
@GetMapping
public String get(@PathVariable("proxyId") long proxyId, Model model) {
Optional<ProxyInstanceDTO> proxyInstanceDTO = proxyInstanceService.findById(proxyId);
model.addAttribute("proxyInstance", proxyInstanceDTO.orElse(new ProxyInstanceDTO()));
return "proxyForm";
}
@PostMapping
public String save(@PathVariable("proxyId") long proxyId, ProxyInstanceDTO proxyInstanceDTO) {
if (proxyId == 0) {
proxyInstanceService.create(proxyInstanceDTO);
} else {
proxyInstanceService.save(proxyInstanceDTO);
}
proxyManagerService.updateProxies();
return "redirect:/proxy";
}
@GetMapping(value = "/toggle")
public String toggle(@PathVariable("proxyId") long proxyId) {
proxyInstanceService.toggleEnable(proxyId);
proxyManagerService.updateProxies();
return "redirect:/proxy";
}
}

View File

@ -0,0 +1,22 @@
package ru.bvn13.jproxy.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
/**
* Created by bvn13 on 24.10.2018.
*/
@Controller
@RequestMapping("/proxy")
public class ProxyListController {
@GetMapping
public String get(Model model) {
model.addAttribute("proxyInstance", new ProxyInstanceDTO());
return "proxylist";
}
}

View File

@ -1,4 +1,4 @@
package ru.bvn13.jproxy;
package ru.bvn13.jproxy.engine;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@ -27,7 +27,7 @@ public class ClientListener implements Runnable {
private DataOutputStream internalOutStream;
private DataOutputStream externalOutStream;
AtomicBoolean isTerminated = new AtomicBoolean(false);
private AtomicBoolean isTerminated = new AtomicBoolean(false);
private static class SenderThread implements Runnable {
private Socket senderSocket;
@ -38,7 +38,7 @@ public class ClientListener implements Runnable {
private String name;
private ClientListener owner;
public SenderThread(ClientListener owner, String name, Socket senderSocket, Socket receiverSocket, DataInputStream sender, DataOutputStream receiver, int bufferLength) {
SenderThread(ClientListener owner, String name, Socket senderSocket, Socket receiverSocket, DataInputStream sender, DataOutputStream receiver, int bufferLength) {
this.owner = owner;
this.name = name;
this.senderSocket = senderSocket;
@ -124,4 +124,17 @@ public class ClientListener implements Runnable {
private void startExternalToInternalSender() {
executor.execute(new SenderThread(this,"RECEIVER", externalSocket, internalSocket, externalInStream, internalOutStream, 4096));
}
public void stopIt() {
try {
externalSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
internalSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -1,10 +1,13 @@
package ru.bvn13.jproxy;
package ru.bvn13.jproxy.engine;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* Created by bvn13 on 20.10.2018.
@ -13,17 +16,18 @@ public class ProxyServer {
private final ExecutorService executor = Executors.newCachedThreadPool();
public ProxyServer(int portListen, String extHost, int extPort) {
List<ClientListener> clients = Collections.synchronizedList(new ArrayList<>());
public ProxyServer(String localHost, int portListen, String extHost, int extPort) {
executor.execute(() -> {
try (ServerSocket server = new ServerSocket(portListen)) {
try (ServerSocket server = new ServerSocket(portListen, 0, InetAddress.getByName(localHost))) {
while (!server.isClosed()) {
Socket client = server.accept();
executor.execute(new ClientListener(client, extHost, extPort));
ClientListener clientListener = new ClientListener(client, extHost, extPort);
executor.execute(clientListener);
clients.add(clientListener);
}
} catch (IOException e) {
@ -35,4 +39,10 @@ public class ProxyServer {
}
public void stop() {
clients.forEach(ClientListener::stopIt);
executor.shutdown();
}
}

View File

@ -0,0 +1,62 @@
package ru.bvn13.jproxy.entities;
import com.googlecode.jmapper.annotations.JMap;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
/**
* Created by bvn13 on 24.10.2018.
*/
@Getter
@Setter
@Entity
public class ProxyInstance {
//@JMap
@Id
@GeneratedValue
private long id;
@JMap
@Column(nullable = false)
@NotNull
@ColumnDefault(value = "false")
private boolean enabled;
@JMap
@Column(nullable = false)
@NotNull
private String name;
@JMap
@Column(nullable = false)
@NotNull
@ColumnDefault(value = "")
private String localHost;
@JMap
@Column(nullable = false)
@NotNull
@ColumnDefault(value = "0")
private int localPort;
@JMap
@Column(nullable = false)
@NotNull
@ColumnDefault(value = "")
private String remoteHost;
@JMap
@Column(nullable = false)
@NotNull
@ColumnDefault(value = "0")
private int remotePort;
}

View File

@ -0,0 +1,43 @@
package ru.bvn13.jproxy.entities.dtos;
import com.googlecode.jmapper.annotations.JMap;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
/**
* Created by bvn13 on 24.10.2018.
*/
@Getter
@Setter
public class ProxyInstanceDTO {
@JMap
private long id;
@JMap
@NotNull
private boolean enabled;
@JMap
@NotNull
private String name;
@JMap
@NotNull
private String localHost;
@JMap
@NotNull
private int localPort;
@JMap
@NotNull
private String remoteHost;
@JMap
@NotNull
private int remotePort;
}

View File

@ -0,0 +1,21 @@
package ru.bvn13.jproxy.exceptions;
/**
* Created by bvn13 on 27.10.2018.
*/
public class ProxyAlreadyEnabled extends RuntimeException {
private long id;
private String name;
public ProxyAlreadyEnabled(long id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return String.format("Proxy already enabled: %d, %s", id, name);
}
}

View File

@ -0,0 +1,28 @@
package ru.bvn13.jproxy.mapping;
import com.googlecode.jmapper.JMapper;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.bvn13.jproxy.entities.ProxyInstance;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
/**
* Created by bvn13 on 24.10.2018.
*/
@Configuration
public class MappingConfiguration {
@Bean
@Qualifier("proxyInstanceToProxyInstanceDtoMapper")
public JMapper<ProxyInstanceDTO, ProxyInstance> proxyInstanceToProxyInstanceDtoMapper() {
return new JMapper<>(ProxyInstanceDTO.class, ProxyInstance.class);
}
@Bean
@Qualifier("proxyInstanceDtoToProxyInstanceMapper")
public JMapper<ProxyInstance, ProxyInstanceDTO> proxyInstanceDtoToProxyInstanceMapper() {
return new JMapper<>(ProxyInstance.class, ProxyInstanceDTO.class);
}
}

View File

@ -0,0 +1,17 @@
package ru.bvn13.jproxy.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.bvn13.jproxy.entities.ProxyInstance;
import java.util.Optional;
/**
* Created by bvn13 on 24.10.2018.
*/
@Repository
public interface ProxyInstanceRepository extends JpaRepository<ProxyInstance, Long> {
Optional<ProxyInstance> getById(Long id);
}

View File

@ -0,0 +1,83 @@
package ru.bvn13.jproxy.services;
import com.googlecode.jmapper.JMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.bvn13.jproxy.entities.ProxyInstance;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
import ru.bvn13.jproxy.repositories.ProxyInstanceRepository;
import javax.persistence.EntityNotFoundException;
import javax.transaction.Transactional;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Created by bvn13 on 24.10.2018.
*/
@Service
public class ProxyInstanceService {
@Autowired
private ProxyInstanceRepository proxyInstanceRepository;
@Autowired
@Qualifier("proxyInstanceToProxyInstanceDtoMapper")
private JMapper<ProxyInstanceDTO, ProxyInstance> proxyInstanceToProxyInstanceDtoMapper;
@Autowired
@Qualifier("proxyInstanceDtoToProxyInstanceMapper")
private JMapper<ProxyInstance, ProxyInstanceDTO> proxyInstanceDtoToProxyInstanceMapper;
public List<ProxyInstanceDTO> findAllDTOs() {
return proxyInstanceRepository.findAll().stream()
.map(p -> proxyInstanceToProxyInstanceDtoMapper.getDestination(p))
.sorted(Comparator.comparing(ProxyInstanceDTO::getName))
.collect(Collectors.toList());
}
public Optional<ProxyInstanceDTO> findById(long id) {
return proxyInstanceRepository.findById(id)
.flatMap(p -> Optional.of(proxyInstanceToProxyInstanceDtoMapper.getDestination(p)));
}
@Transactional
public void save(ProxyInstanceDTO proxyInstanceDTO) {
Optional<ProxyInstance> proxy = proxyInstanceRepository.getById(proxyInstanceDTO.getId());
if (proxy.isPresent()) {
ProxyInstance proxyInstance = proxy.get();
proxyInstanceDtoToProxyInstanceMapper.getDestination(proxyInstance, proxyInstanceDTO);
proxyInstanceRepository.save(proxyInstance);
} else {
throw new EntityNotFoundException(String.format("Proxy not found by ID: %d", proxyInstanceDTO.getId()));
}
}
@Transactional
public void create(ProxyInstanceDTO proxyInstanceDTO) {
ProxyInstance proxyInstance = proxyInstanceDtoToProxyInstanceMapper.getDestination(proxyInstanceDTO);
proxyInstanceRepository.save(proxyInstance);
}
@Transactional
public void toggleEnable(long id) {
Optional<ProxyInstance> proxy = proxyInstanceRepository.getById(id);
if (proxy.isPresent()) {
ProxyInstance proxyInstance = proxy.get();
proxyInstance.setEnabled(!proxyInstance.isEnabled());
proxyInstanceRepository.save(proxyInstance);
} else {
throw new EntityNotFoundException(String.format("Proxy not found by ID: %d", id));
}
}
}

View File

@ -0,0 +1,104 @@
package ru.bvn13.jproxy.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.bvn13.jproxy.engine.ProxyServer;
import ru.bvn13.jproxy.entities.dtos.ProxyInstanceDTO;
import ru.bvn13.jproxy.exceptions.ProxyAlreadyEnabled;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by bvn13 on 23.10.2018.
*/
@Service
public class ProxyManagerService {
@Autowired
private ProxyInstanceService proxyInstanceService;
private Map<Long, ProxyInstanceDTO> proxySettings = new HashMap<>();
private Map<Long, ProxyServer> proxies = new HashMap<>();
public boolean isRunnig(long id) {
synchronized (this) {
if (proxySettings.containsKey(id)) {
return proxySettings.get(id).isEnabled() && proxies.containsKey(id);
} else {
return false;
}
}
}
@PostConstruct
public void init() {
updateProxies();
}
public void updateProxies() {
Map<Long, ProxyInstanceDTO> proxiesForStart = new HashMap<>();
List<Long> proxiesForStop = new ArrayList<>();
Map<Long, ProxyInstanceDTO> proxiesForUpdate = new HashMap<>();
synchronized (this) {
List<ProxyInstanceDTO> actualProxyList = proxyInstanceService.findAllDTOs();
actualProxyList.forEach(ap -> {
// case it is a new proxy
if (!proxySettings.containsKey(ap.getId())) {
if (ap.isEnabled()) {
proxiesForStart.put(ap.getId(), ap);
}
} else {
ProxyInstanceDTO currentProxy = proxySettings.get(ap.getId());
if (currentProxy.isEnabled() && !ap.isEnabled()) {
proxiesForStop.add(ap.getId());
} else if (currentProxy.isEnabled() != ap.isEnabled()
|| !currentProxy.getLocalHost().equals(ap.getLocalHost())
|| currentProxy.getLocalPort() != ap.getLocalPort()
|| !currentProxy.getRemoteHost().equals(ap.getRemoteHost())
|| currentProxy.getRemotePort() != ap.getRemotePort()
) {
proxiesForUpdate.put(currentProxy.getId(), ap);
}
}
});
proxiesForStart.forEach(this::startProxy);
proxiesForStop.forEach(this::stopProxy);
proxiesForUpdate.forEach(this::updateProxy);
}
}
private void startProxy(long id, ProxyInstanceDTO proxyInstanceDTO) {
if (proxySettings.containsKey(id)) {
throw new ProxyAlreadyEnabled(id, proxyInstanceDTO.getName());
}
ProxyServer proxyServer = new ProxyServer(proxyInstanceDTO.getLocalHost(), proxyInstanceDTO.getLocalPort(), proxyInstanceDTO.getRemoteHost(), proxyInstanceDTO.getRemotePort());
proxySettings.put(id, proxyInstanceDTO);
proxies.put(id, proxyServer);
}
private void stopProxy(long id) {
if (proxySettings.containsKey(id)) {
proxies.get(id).stop();
proxies.remove(id);
proxySettings.remove(id);
}
}
private void updateProxy(long id, ProxyInstanceDTO proxyInstanceDTO) {
if (proxySettings.containsKey(id)) {
proxies.get(id).stop();
proxies.remove(id);
proxySettings.remove(id);
}
startProxy(id, proxyInstanceDTO);
}
}

View File

@ -0,0 +1,29 @@
jproxy.username=user
jproxy.password=pass123
server.address=localhost
server.port=8080
#spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.driver-class-name=org.h2.Driver
#spring.datasource.url=jdbc:hsqldb:file:db2/jproxy.h2db
spring.datasource.url=jdbc:h2:file:./db/jproxy.h2db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
spring.datasource.username=sa
spring.datasource.password=sa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#spring.jpa.hibernate.naming.implicit-strategy= naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# Templates reloading during development
#spring.thymeleaf.prefix=${project.base-dir}/src/main/resources/templates/
#spring.thymeleaf.cache=false
#
## Static resources reloading during development
#spring.resources.static-locations=${project.base-dir}/src/main/resources/static/
#spring.resources.cache.period=0

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
</head>
<body>
<th:block th:fragment="proxy-form (proxyId, proxyInst)">
<form action="#" th:action="@{'/proxy/'+${proxyId}}" method="post">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="hidden" name="id" th:value="${proxyId}">
<p>
<label th:for="name"><span>Name</span></label>
<input type="text" th:name="name" th:value="${proxyInst.name}"/>
</p>
<p>
<label th:for="localHost"><span>Local host</span></label>
<input type="text" th:name="localHost" th:value="${proxyInst.localHost}"/>
</p>
<p>
<label th:for="localPort"><span>Local port</span></label>
<input type="number" th:name="localPort" th:value="${proxyInst.localPort}"/>
</p>
<p>
<label th:for="remoteHost"><span>Remote host</span></label>
<input type="text" th:name="remoteHost" th:value="${proxyInst.remoteHost}"/>
</p>
<p>
<label th:for="remotePort"><span>Remote port</span></label>
<input type="number" th:name="remotePort" th:value="${proxyInst.remotePort}"/>
</p>
<button type="submit"><span th:text="${proxyId == 0 ? 'Create' : 'Save'}">Save | Create</span></button>
</form>
</th:block>
</body>
</html>

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
</head>
<body>
<p>Hello, <span th:text="${username}"></span>!</p>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Logout form</title>
</head>
<body>
<form action="/logout" method="post">
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
<input type="submit" value="Logout">
</form>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>
<th:block th:if="${proxyInstance.id} == 0">New proxy</th:block>
<th:block th:if="${proxyInstance.id} == 0" th:text="'Proxy #'+${proxyInstance.id}"></th:block>
</title>
</head>
<body>
<th:block th:replace="decorators/proxyForm :: proxy-form (proxyId=${proxyInstance.id}, proxyInst=${proxyInstance})"></th:block>
</body>
</html>

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Proxy list</title>
</head>
<body>
<table border="1" style="width:300px">
<tr>
<td>Running</td>
<td>Enabled</td>
<td>Name</td>
<td>Local host</td>
<td>Local port</td>
<td>Remote host</td>
<td>Remote port</td>
<td>Manage</td>
</tr>
<th:block th:each="proxy : ${@proxyInstanceList.proxyInstances}">
<tr>
<td><span th:text="${@proxyManagerService.isRunnig(proxy.id)}"></span></td>
<td>
<th:block th:if="${proxy.enabled}">
V
</th:block>
</td>
<td th:text="${proxy.name}">Name</td>
<td th:text="${proxy.localHost}">Local host</td>
<td th:text="${proxy.localPort}">Local port</td>
<td th:text="${proxy.remoteHost}">Remote host</td>
<td th:text="${proxy.remotePort}">Remote port</td>
<td>
<a href="#" th:href="@{'/proxy/'+${proxy.id}+'/toggle'}">
<th:block th:if="${proxy.enabled}">
disable
</th:block>
<th:block th:if="not ${proxy.enabled}">
enable
</th:block>
</a>
&nbsp;
<a href="#" th:href="@{'/proxy/'+${proxy.id}}">edit</a>
</td>
</tr>
</th:block>
</table>
<p>
<a href="#" th:href="@{/proxy/0}">Add proxy</a>
</p>
</body>
</html>

View File

@ -4,8 +4,7 @@ import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import ru.bvn13.jproxy.JProxy;
import ru.bvn13.jproxy.ProxyServer;
import ru.bvn13.jproxy.engine.ProxyServer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@ -29,11 +28,11 @@ public class JProxyTest
"Host: yandex.ru\n" +
"Accept-Language: en-us\n" +
"Accept-Encoding: gzip, deflate\n" +
"Connection: Keep-Alive";
"Connection: Keep-Alive\n"+
"\n";
@Before
public void before() {
//proxy = new ProxyServer(8099, "yandex.ru", 80);
}
@Test