Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .project
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>springboot</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
</projectDescription>
4 changes: 4 additions & 0 deletions configurationapp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/target/
/.settings/
/.classpath
/.project
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
package com.att.dao.configurations;

import com.att.data.configurations.ConfigValue;
import org.springframework.stereotype.Service;

import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

@Service
@Repository
public class ConfigurationDao {
private class IdProvider {
private int currentId;
// Uses CAS and better than synchronized
private AtomicInteger currentId;

public IdProvider() {
currentId = 0;
currentId = new AtomicInteger(0);
}

public int getNextId() {
return this.currentId++;
return this.currentId.incrementAndGet();
}
}

Expand All @@ -34,15 +37,44 @@ public ConfigurationDao() {
}

public List<ConfigValue> getConfigurationsForYearMonth(String yearMonth) {
return new ArrayList<>();

List<ConfigValue> configValues = currentConfigurations.get(yearMonth);

return (configValues != null ? configValues : new ArrayList<>());
}

public void addConfiguration(String yearMonth, ConfigValue value) {

int newId = idProvider.getNextId();
value.setConfigId(newId);

// multiple threads can try to access the map at the same time
synchronized(currentConfigurations)
{
if (currentConfigurations.containsKey(yearMonth)) {
currentConfigurations.get(yearMonth).add(value);
}
else {

List<ConfigValue> configValues = new ArrayList<ConfigValue>();
configValues.add(value);

currentConfigurations.put(yearMonth, configValues);
}
}
}

public void removeAllConfigurationsForYearMonth(String yearMonth) {

currentConfigurations.remove(yearMonth);
}

public void removeSingleConfigurationForYearMonth(String yearMonth, int configId) {

synchronized(currentConfigurations) {
if (currentConfigurations.containsKey(yearMonth)) {
currentConfigurations.get(yearMonth).removeIf(cv -> (cv.getConfigId() == configId));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.att.service.configurations;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.att.dao.configurations.ConfigurationDao;
import com.att.data.configurations.ConfigValue;

@Service
public class ConfigurationService {

@Autowired
private ConfigurationDao dao;

public List<ConfigValue> getConfigurationsForYearMonth(String yearMonth) {

return dao.getConfigurationsForYearMonth(yearMonth);
}

public void addConfiguration(String yearMonth, ConfigValue value) {

dao.addConfiguration(yearMonth, value);
}

public void removeAllConfigurationsForYearMonth(String yearMonth) {

dao.removeAllConfigurationsForYearMonth(yearMonth);
}

public void removeSingleConfigurationForYearMonth(String yearMonth, int configId) {

dao.removeSingleConfigurationForYearMonth(yearMonth, configId);
}

}
Original file line number Diff line number Diff line change
@@ -1,45 +1,49 @@
package com.att.web.configuarations;

import com.att.dao.configurations.ConfigurationDao;
import com.att.data.configurations.ConfigValue;
import com.att.service.configurations.ConfigurationService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping(value="/configuration")
@RequestMapping(value="/configurations")
public class ConfigurationController {

private ConfigurationDao dao;

@Autowired
public ConfigurationController(ConfigurationDao dao) {
this.dao = dao;
}

@Autowired
private ConfigurationService service;

@RequestMapping(value="/{yearMonthNumber}", method=RequestMethod.GET)
@ResponseBody
public List<ConfigValue> getConfigurationsForYearMonth(
@PathVariable("yearMonthNumber") String yearMonth) {

return new ArrayList<>();
return service.getConfigurationsForYearMonth(yearMonth);
}

@RequestMapping(value="/{yearMonthNumber}", method={ RequestMethod.POST, RequestMethod.PUT})
public void addConfigurationForYearMonth(
@PathVariable("yearMonthNumber") String yearMonth,
@RequestBody ConfigValue value) {

service.addConfiguration(yearMonth, value);

}

@RequestMapping(value="/{yearMonthNumber}", method=RequestMethod.DELETE)
public void deleteConfigurationsForYearMonth(@PathVariable("yearMonthNumber") String yearMonth) {
try {

} catch (Exception ex) {

}

service.removeAllConfigurationsForYearMonth(yearMonth);
}

@RequestMapping(value="/{yearMonthNumber}", method={ RequestMethod.POST, RequestMethod.PUT })
public void addConfigurationForYearMonth(
@RequestMapping(value="/{yearMonthNumber}/{configId}", method={ RequestMethod.DELETE})
public void deleteConfigurationForYearMonth(
@PathVariable("yearMonthNumber") String yearMonth,
@RequestBody ConfigValue value) {
@PathVariable("configId") int configId) {

service.removeSingleConfigurationForYearMonth(yearMonth, configId);

}
}
7 changes: 5 additions & 2 deletions configurationapp/src/main/resources/static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
<html>
<head>
<title>Configuration App</title>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script src="js/app.js"></script>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" />
<link rel="stylesheet" href="css/main.css" />
</head>
<body>
<h1>Welcome To The Configuration App</h1>
Expand Down Expand Up @@ -35,7 +36,9 @@ <h1>Welcome To The Configuration App</h1>
</table>
</div>
<div class="controls">
<button id="saveButton">Save Configurations</button>
<button id="addConfig">Add Configuration</button>
<button id="deleteConfig">Delete Configuration</button>
<button id="deleteAllConfigs">Delete All Configurations</button>
</div>
</div>
<script>
Expand Down
104 changes: 98 additions & 6 deletions configurationapp/src/main/resources/static/js/app.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,116 @@
(function() {
function App() {

var datatable;
}

App.prototype.getData = function() {
$.ajax('',{

}).then(function(data) {
$.ajax('/configurations/' + $('#timePeriod').val()).then(function(data) {
datatable.clear().rows.add(data).draw();
},
function(error) {
alert(error);
});
};

App.prototype.addConfig = function() {

$.ajax({
type: "POST",
url : '/configurations/' + $('#timePeriod').val(),
data: JSON.stringify({ configId: -1, configName: 'A'}),
contentType: 'application/json'
}).
then(function(data) {
app.getData();
},
function(error) {
alert(error);
});
};

App.prototype.deleteConfig = function() {

if (datatable.rows('.selected').data().length == 0) {
alert('Please select atleast 1 row for deletion');
return;
}

var configId = $.map(datatable.rows('.selected').data(), function (item) {
return item.configId;
});

$.ajax({
type: "DELETE",
url : '/configurations/' + $('#timePeriod').val() + '/' + configId
})
.then(function(data) {
app.getData();
},
function(error) {
alert(error);
});

};

App.prototype.deleteAllConfigs = function() {
$.ajax({
type: "DELETE",
url : '/configurations/' + $('#timePeriod').val()
})
.then(function(data) {
app.getData();
},
function(error) {
alert(error);
})
};

App.prototype.init = function() {
$('#configTable').DataTable({

/* Init Datatable */

datatable = $('#configTable').DataTable({
scrollY: 300,
paging: false,
sorting: false,
searching: false,
info: false
info: false,
columns: [
{ data: "configId" },
{ data: "configName" }
]
});

// Add click events
$('#configTable tbody').on( 'click', 'tr', function () {
if ( $(this).hasClass('selected') ) {
$(this).removeClass('selected');
}
else {
datatable.$('tr.selected').removeClass('selected');
$(this).addClass('selected');
}
});

/* Event Bindings */

$('#timePeriod').on( 'change', function () {
app.getData();
});

$('#addConfig').on( 'click', function () {
app.addConfig();
});

$('#deleteConfig').on( 'click', function () {
app.deleteConfig();
});

$('#deleteAllConfigs').on( 'click', function () {
app.deleteAllConfigs();
});

this.getData();
};

window.app = new App;
Expand Down