Skip to content

Mise à jour : Ajout de nouvelles fonctionnalités et correction des bugs #203

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
56 changes: 56 additions & 0 deletions java-apps/CitiesApp/CitiesGUI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class CitiesGUI extends JFrame {
private List<City> cities;

public CitiesGUI() {
super("Cities Viewer");
cities = loadCities("../data/cities.txt");
setupUI();
}

private List<City> loadCities(String path) {
List<City> list = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("#");
if (parts.length == 11) {
String ref = parts[0];
String nameGR = parts[1];
String gender = parts[8];
String nameEN = parts[9];
String state = parts[10];
list.add(new City(ref, nameGR, gender, nameEN, state));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

private void setupUI() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
String[] columns = {"Greek Name", "Gender", "English Name", "State"};
DefaultTableModel model = new DefaultTableModel(columns, 0);
for (City c : cities) {
model.addRow(new Object[]{c.getNameGR(), c.getGender(), c.getNameEN(), c.getState()});
}
JTable table = new JTable(model);
add(new JScrollPane(table), BorderLayout.CENTER);
setSize(600, 400);
setLocationRelativeTo(null);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new CitiesGUI().setVisible(true));
}
}
21 changes: 21 additions & 0 deletions java-apps/CitiesApp/City.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
public class City {
private String ref;
private String nameGR;
private String gender;
private String nameEN;
private String state;

public City(String ref, String nameGR, String gender, String nameEN, String state) {
this.ref = ref;
this.nameGR = nameGR;
this.gender = gender;
this.nameEN = nameEN;
this.state = state;
}

public String getRef() { return ref; }
public String getNameGR() { return nameGR; }
public String getGender() { return gender; }
public String getNameEN() { return nameEN; }
public String getState() { return state; }
}
56 changes: 56 additions & 0 deletions java-apps/NamedEntitiesApp/NamedEntitiesGUI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class NamedEntitiesGUI extends JFrame {
private List<NamedEntity> entities;

public NamedEntitiesGUI() {
super("Named Entities Viewer");
entities = loadEntities("../data/namedEntities.txt");
setupUI();
}

private List<NamedEntity> loadEntities(String path) {
List<NamedEntity> list = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("#");
if (parts.length == 11) {
String ref = parts[0];
String nameGR = parts[1];
String gender = parts[8];
String nameEN = parts[9];
String type = parts[10];
list.add(new NamedEntity(ref, nameGR, gender, nameEN, type));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

private void setupUI() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
String[] columns = {"Greek Name", "Gender", "English Name", "Type"};
DefaultTableModel model = new DefaultTableModel(columns, 0);
for (NamedEntity e : entities) {
model.addRow(new Object[]{e.getNameGR(), e.getGender(), e.getNameEN(), e.getType()});
}
JTable table = new JTable(model);
add(new JScrollPane(table), BorderLayout.CENTER);
setSize(700, 400);
setLocationRelativeTo(null);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new NamedEntitiesGUI().setVisible(true));
}
}
21 changes: 21 additions & 0 deletions java-apps/NamedEntitiesApp/NamedEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
public class NamedEntity {
private String ref;
private String nameGR;
private String gender;
private String nameEN;
private String type;

public NamedEntity(String ref, String nameGR, String gender, String nameEN, String type) {
this.ref = ref;
this.nameGR = nameGR;
this.gender = gender;
this.nameEN = nameEN;
this.type = type;
}

public String getRef() { return ref; }
public String getNameGR() { return nameGR; }
public String getGender() { return gender; }
public String getNameEN() { return nameEN; }
public String getType() { return type; }
}
24 changes: 24 additions & 0 deletions java-apps/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Java GUI Applications

This folder contains two simple Swing applications used for the university course "Methodologies for Application Development".

- **CitiesApp** – Reads `data/cities.txt` and displays a table with Greek and English names of selected cities.
- **NamedEntitiesApp** – Reads `data/namedEntities.txt` and displays a table with different named entities such as museums or airports.

Data files are encoded in UTF-8 and follow the format described in the assignment specification.

To run an application use:

```bash
javac CitiesApp/*.java
java -cp CitiesApp CitiesGUI
```

or

```bash
javac NamedEntitiesApp/*.java
java -cp NamedEntitiesApp NamedEntitiesGUI
```

The GUI simply lists the items and does not implement advanced features.
3 changes: 3 additions & 0 deletions java-apps/data/cities.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1#Αθήνα#Αθήνα#Αθήνας#Αθήνα#Αθήνα#Αθήνα#Αθήνα#feminine#Athens#Attica
2#Θεσσαλονίκη#Θεσσαλονίκη#Θεσσαλονίκης#Θεσσαλονίκη#Θεσσαλονίκη#Θεσσαλονίκη#Θεσσαλονίκη#feminine#Thessaloniki#Central Macedonia
3#Πάτρα#Πάτρα#Πάτρας#Πάτρα#Πάτρα#Πάτρα#Πάτρα#feminine#Patras#Western Greece
3 changes: 3 additions & 0 deletions java-apps/data/namedEntities.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1#Εθνική Πινακοθήκη#Εθνική Πινακοθήκη#Εθνικής Πινακοθήκης#Εθνική Πινακοθήκη#Εθνική Πινακοθήκη#Εθνική Πινακοθήκη#Εθνική Πινακοθήκη#feminine#National Gallery#Museum
2#Πανεπιστήμιο Αθηνών#Πανεπιστήμιο Αθηνών#Πανεπιστημίου Αθηνών#Πανεπιστήμιο Αθηνών#Πανεπιστήμιο Αθηνών#Πανεπιστήμιο Αθηνών#Πανεπιστήμιο Αθηνών#neuter#University of Athens#University
3#Διεθνές Αεροδρόμιο Αθηνών#Διεθνές Αεροδρόμιο Αθηνών#Διεθνούς Αεροδρομίου Αθηνών#Διεθνές Αεροδρόμιο Αθηνών#Διεθνές Αεροδρόμιο Αθηνών#Διεθνές Αεροδρόμιο Αθηνών#Διεθνές Αεροδρόμιο Αθηνών#neuter#Athens International Airport#Airport
49 changes: 36 additions & 13 deletions server/database/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,16 @@ const dealerships_data = JSON.parse(fs.readFileSync("dealerships.json", 'utf8'))

mongoose.connect("mongodb://mongo_db:27017/",{'dbName':'dealershipsDB'});


const Dealerships = require('./dealership');
const Reviews = require('./review');

const Dealerships = require('./dealership');


try {
Reviews.deleteMany({}).then(()=>{
Reviews.insertMany(reviews_data['reviews']);
});
Dealerships.deleteMany({}).then(()=>{
Dealerships.insertMany(dealerships_data['dealerships']);
});

await Dealerships.deleteMany({});
await Dealerships.insertMany(dealerships_data['dealerships']);
await Reviews.deleteMany({});
await Reviews.insertMany(reviews_data['reviews']);
} catch (error) {
res.status(500).json({ error: 'Error fetching documents' });
}
Expand Down Expand Up @@ -58,19 +55,45 @@ app.get('/fetchReviews/dealer/:id', async (req, res) => {

// Express route to fetch all dealerships
app.get('/fetchDealers', async (req, res) => {
//Write your code here
try {
console.log("fetchDealers endpoint hit");
const dealers = await Dealerships.find();
res.json(dealers);
} catch (error) {
res.status(500).json({ message: error.message });
}
});

// Express route to fetch Dealers by a particular state
app.get('/fetchDealers/:state', async (req, res) => {
//Write your code here
app.get('/fetchDealer/:state', async (req, res) => {
try {
const dealer = await Dealerships.find({st: req.params.state});
if (dealer) {
res.status(200).json(dealer);
} else {
res.status(404).json({ message: 'Dealer not found' });
}
} catch (error) {
res.status(500).json({ message: error.message });
}
});


// Express route to fetch dealer by a particular id
app.get('/fetchDealer/:id', async (req, res) => {
//Write your code here
try {
const dealer = await Dealerships.find({id: req.params.id});
if (dealer) {
res.status(200).json(dealer);
} else {
res.status(404).json({ message: 'Dealer not found' });
}
} catch (error) {
res.status(500).json({ message: error.message });
}
});


//Express route to insert review
app.post('/insert_review', express.raw({ type: '*/*' }), async (req, res) => {
data = JSON.parse(req.body);
Expand Down
8 changes: 6 additions & 2 deletions server/database/dealership.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const dealerships = new Schema({
type: String,
required: true
},
st :{
type: String,
required:true
},
address: {
type: String,
required: true
Expand All @@ -24,11 +28,11 @@ const dealerships = new Schema({
required: true
},
lat: {
type: String,
type: Number,
required: true
},
long: {
type: String,
type: Number,
required: true
},
short_name: {
Expand Down
10 changes: 5 additions & 5 deletions server/djangoapp/admin.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# from django.contrib import admin
# from .models import related models


# Register your models here.
from django.contrib import admin
from .models import CarMake, CarModel
# Registering models with their respective admins
admin.site.register(CarMake)
admin.site.register(CarModel)

# CarModelInline class

Expand Down
54 changes: 35 additions & 19 deletions server/djangoapp/models.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,41 @@
# Uncomment the following imports before adding the Model code
from django.db import models
from datetime import datetime
from django.utils.timezone import now
from django.core.validators import MaxValueValidator, MinValueValidator

# from django.db import models
# from django.utils.timezone import now
# from django.core.validators import MaxValueValidator, MinValueValidator


# Create your models here.
class CarMake(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()

# <HINT> Create a Car Make model `class CarMake(models.Model)`:
# - Name
# - Description
# - Any other fields you would like to include in car make model
# - __str__ method to print a car make object
def __str__(self):
return self.name


# <HINT> Create a Car Model model `class CarModel(models.Model):`:
# - Many-To-One relationship to Car Make model (One Car Make has many
# Car Models, using ForeignKey field)
# - Name
# - Type (CharField with a choices argument to provide limited choices
# such as Sedan, SUV, WAGON, etc.)
# - Year (IntegerField) with min value 2015 and max value 2023
# - Any other fields you would like to include in car model
# - __str__ method to print a car make object

class CarModel(models.Model):
car_make = models.ForeignKey(CarMake, on_delete=models.CASCADE) # Establishes Many-to-One relationship
name = models.CharField(max_length=100)
dealer_id = models.IntegerField() # Refers to a dealer in another database (e.g., Cloudant)

# Car types with limited choices
CAR_TYPES = [
('SEDAN', 'Sedan'),
('SUV', 'SUV'),
('WAGON', 'Wagon'),
# Add more types if needed
]
type = models.CharField(max_length=10, choices=CAR_TYPES, default='SUV')

# Year of manufacture with validators
year = models.IntegerField(
validators=[
MaxValueValidator(datetime.now().year),
MinValueValidator(1980)
],
default=datetime.now().year
)

def __str__(self):
return f"{self.car_make.name} {self.name}"
Loading