Add files via upload
This commit is contained in:
parent
0ca4ebb0cd
commit
d27fa84ab4
25
README.md
Normal file
25
README.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# WallPost
|
||||||
|
|
||||||
|
A Java Swing application which allows to post articles on a remote "wall"
|
||||||
|
|
||||||
|
Includes:
|
||||||
|
|
||||||
|
* SignUp/SignIn
|
||||||
|
* Posting stories
|
||||||
|
* Reading stories
|
||||||
|
* Multi-threaded server
|
||||||
|
* State persistence
|
||||||
|
|
||||||
|
Employs a custom protocol in communication ("FOLLOWS protocol" to exchange variables)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> **Notice**
|
||||||
|
> This is just a demonstrative application
|
||||||
|
> It lacks basic functionalities as editing and upvoting, and relies on terrible storage and authentication, in fact it does not even use SSL or TLS
|
||||||
|
> Be aware of this
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* WallPost: The client
|
||||||
|
* WallPostServer: The server
|
11
WallPost/WallPost.iml
Normal file
11
WallPost/WallPost.iml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
5
WallPost/src/HeaderNotFoundException.java
Normal file
5
WallPost/src/HeaderNotFoundException.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
public class HeaderNotFoundException extends Exception{
|
||||||
|
public HeaderNotFoundException(){
|
||||||
|
super("Header not found");
|
||||||
|
}
|
||||||
|
}
|
35
WallPost/src/Post.java
Normal file
35
WallPost/src/Post.java
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
public class Post {
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBody() {
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String title, body,author, date;
|
||||||
|
private int id;
|
||||||
|
public void setBody(String body) {
|
||||||
|
this.body = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Post(String title, String body, String author, String date, int id){
|
||||||
|
this.title=title;
|
||||||
|
this.body=body;
|
||||||
|
this.author=author;
|
||||||
|
this.date=date;
|
||||||
|
this.id=id;
|
||||||
|
}
|
||||||
|
}
|
5
WallPost/src/PostList.java
Normal file
5
WallPost/src/PostList.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class PostList extends ArrayList<Post>{
|
||||||
|
|
||||||
|
}
|
230
WallPost/src/ServerConnection.java
Normal file
230
WallPost/src/ServerConnection.java
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.rmi.ServerError;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class ServerConnection {
|
||||||
|
private Socket socket;
|
||||||
|
private InputStreamReader i;
|
||||||
|
private BufferedReader in;
|
||||||
|
private OutputStreamWriter osw;
|
||||||
|
private BufferedWriter bw;
|
||||||
|
private PrintWriter out;
|
||||||
|
private ArrayList<String> headers=new ArrayList<String>();
|
||||||
|
private ArrayList<String> values=new ArrayList<String>();
|
||||||
|
private JFrame window;
|
||||||
|
public ServerConnection(JFrame window) throws IOException {
|
||||||
|
this.window=window;
|
||||||
|
socket= new Socket("mascmt.ddns.net",70);
|
||||||
|
i= new InputStreamReader(socket.getInputStream());
|
||||||
|
in = new BufferedReader(i);
|
||||||
|
osw= new OutputStreamWriter(socket.getOutputStream());
|
||||||
|
bw =new BufferedWriter(osw);
|
||||||
|
out= new PrintWriter(bw, true);
|
||||||
|
out.println("HELLO");
|
||||||
|
}
|
||||||
|
public ArrayList<ArrayList<String>> sendData(String action) throws IOException, ServerErrorException {//lenght of Arralist[] is 2 as in headers, values
|
||||||
|
ArrayList<ArrayList<String>> hv=new ArrayList<ArrayList<String>>();
|
||||||
|
hv.add(new ArrayList<String>());
|
||||||
|
hv.add(new ArrayList<String>());
|
||||||
|
out.println("HELLO AGAIN");
|
||||||
|
out.println("ACTION " + action);
|
||||||
|
for (int c = 0; c < headers.size(); c++) {
|
||||||
|
out.println("FOLLOWS " + headers.get(c).replaceAll("FOLLOWS","follows").replaceAll("END","end"));
|
||||||
|
out.println(values.get(c).replaceAll("FOLLOWS","follows").replaceAll("END","end"));
|
||||||
|
}
|
||||||
|
out.println("END");
|
||||||
|
String line="",temp="";
|
||||||
|
if(in.readLine().equals("ERROR")){
|
||||||
|
while(true){
|
||||||
|
line=in.readLine();
|
||||||
|
if(line.equals("END")){
|
||||||
|
String title=in.readLine();
|
||||||
|
String type=in.readLine();
|
||||||
|
|
||||||
|
if(in.readLine().equals("QUIT")){
|
||||||
|
throw new ServerErrorException(title,temp,in.readLine(),true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw new ServerErrorException(title,temp,in.readLine(),false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
|
||||||
|
temp+=line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int flNum=0;
|
||||||
|
do{
|
||||||
|
line=in.readLine();
|
||||||
|
if(line.startsWith("FOLLOWS")){
|
||||||
|
hv.get(0).add(line.split(" ",2)[1]);
|
||||||
|
if(flNum!=0){
|
||||||
|
hv.get(1).add(temp);
|
||||||
|
}
|
||||||
|
temp="";
|
||||||
|
flNum++;
|
||||||
|
}
|
||||||
|
else if(line.equals("END")){
|
||||||
|
hv.get(1).add(temp);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
temp+=line;
|
||||||
|
}
|
||||||
|
|
||||||
|
}while (!line.equals("END"));
|
||||||
|
return hv;
|
||||||
|
}
|
||||||
|
public void init(){
|
||||||
|
headers.clear();
|
||||||
|
values.clear();
|
||||||
|
}
|
||||||
|
public void bindParam(String h,String v){
|
||||||
|
headers.add(h);
|
||||||
|
values.add(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<ArrayList<String>> handledGetData(String action){
|
||||||
|
ArrayList<ArrayList<String>> s=new ArrayList<ArrayList<String>>(2);
|
||||||
|
try {
|
||||||
|
s=this.sendData(action);
|
||||||
|
} catch (IOException e) {
|
||||||
|
JOptionPane.showMessageDialog(window,
|
||||||
|
"Connection error",
|
||||||
|
"Could not connect to the server",
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
} catch (ServerErrorException e) {
|
||||||
|
handleServerErrorInGUI(e.title,e.message,e.errorType,e.mustQuit);
|
||||||
|
}
|
||||||
|
System.out.println(s.toString());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleServerErrorInGUI(String title, String text, String type, boolean mustQuit){
|
||||||
|
if(type.equals("INFO")){
|
||||||
|
JOptionPane.showMessageDialog(this.window, title, text,JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(type.equals("WARNING")){
|
||||||
|
JOptionPane.showMessageDialog(this.window,
|
||||||
|
title,
|
||||||
|
text,
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(type.equals("PLAIN")){
|
||||||
|
JOptionPane.showMessageDialog(this.window,
|
||||||
|
title,
|
||||||
|
text,
|
||||||
|
JOptionPane.PLAIN_MESSAGE);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else{//ERROR
|
||||||
|
JOptionPane.showMessageDialog(this.window,
|
||||||
|
title,
|
||||||
|
text,
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
|
||||||
|
}
|
||||||
|
if(mustQuit) {
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public String valueByHeader(ArrayList<ArrayList<String>> resp,String header) throws HeaderNotFoundException {
|
||||||
|
for(int i=0;i<resp.get(0).size();i++){
|
||||||
|
if(resp.get(0).get(i).equals(header)){
|
||||||
|
return resp.get(1).get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new HeaderNotFoundException();
|
||||||
|
}
|
||||||
|
public boolean signIn(String username, String password){
|
||||||
|
this.init();
|
||||||
|
this.bindParam("username",username);
|
||||||
|
this.bindParam("password",password);
|
||||||
|
ArrayList<ArrayList<String>> li= this.handledGetData("signIn");
|
||||||
|
try {
|
||||||
|
return this.valueByHeader(li,"status").trim().equals("OK");
|
||||||
|
} catch (HeaderNotFoundException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public boolean signUp(String username, String password){
|
||||||
|
this.init();
|
||||||
|
this.bindParam("username",username);
|
||||||
|
this.bindParam("password",password);
|
||||||
|
ArrayList<ArrayList<String>> li= this.handledGetData("signUp");
|
||||||
|
|
||||||
|
try {
|
||||||
|
return this.valueByHeader(li,"status").trim().equals("OK");
|
||||||
|
} catch (HeaderNotFoundException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public PostList fetchPostsFromServer(){
|
||||||
|
this.init();
|
||||||
|
ArrayList<ArrayList<String>> li =this.handledGetData("listPosts");
|
||||||
|
PostList p= new PostList();
|
||||||
|
int count=0;
|
||||||
|
for(int i=0; i<li.get(0).size();i++){
|
||||||
|
System.out.println(li.get(0).get(i));
|
||||||
|
if(li.get(0).get(i).startsWith("POST-Id")){//POST-Id-0
|
||||||
|
try {
|
||||||
|
Post tp= new Post(this.valueByHeader(li,"POST-Title-"+String.valueOf(count)),"empty",this.valueByHeader(li,"POST-Author-"+String.valueOf(count)),this.valueByHeader(li,"POST-Date-"+String.valueOf(count)),Integer.parseInt(this.valueByHeader(li,"POST-Id-"+String.valueOf(count))));
|
||||||
|
|
||||||
|
p.add(tp);
|
||||||
|
} catch (HeaderNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
|
||||||
|
}
|
||||||
|
public Post fetchPostBodyIfEmpty(PostList list, int index){
|
||||||
|
if(index<0){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Post a=list.get(index);
|
||||||
|
System.out.println(a.toString());
|
||||||
|
if(a.getBody().equals("empty")){
|
||||||
|
this.init();
|
||||||
|
this.bindParam("POST-Id", String.valueOf(a.getId()));
|
||||||
|
ArrayList<ArrayList<String>> li=this.handledGetData("getPostBody");
|
||||||
|
String body="";
|
||||||
|
try {
|
||||||
|
body=this.valueByHeader(li,"body");
|
||||||
|
} catch (HeaderNotFoundException e) {
|
||||||
|
body="An error occurred while loading the post";
|
||||||
|
}
|
||||||
|
a.setBody(body);
|
||||||
|
list.set(index,a);
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
public void publishPost(String title,String body){
|
||||||
|
this.init();
|
||||||
|
this.bindParam("POST-Title",title);
|
||||||
|
this.bindParam("POST-Body",body);
|
||||||
|
this.handledGetData("sendPost");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
NOT SUPPORTED BY SERVER
|
||||||
|
@Deprecated
|
||||||
|
public Post getPost(int Id) throws HeaderNotFoundException {
|
||||||
|
this.init();
|
||||||
|
this.bindParam("POST-Id",String.valueOf(Id));
|
||||||
|
ArrayList<ArrayList<String>> li=this.handledGetData("getPost");
|
||||||
|
Post p= new Post(this.valueByHeader(li,"POST-Title"),this.valueByHeader(li,"POST-Body"),this.valueByHeader(li,"POST-Author"),this.valueByHeader(li,"POST-Date"),Integer.parseInt(this.valueByHeader(li,"POST-Id")));
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
13
WallPost/src/ServerErrorException.java
Normal file
13
WallPost/src/ServerErrorException.java
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
public class ServerErrorException extends Exception{
|
||||||
|
public String message,errorType, title;
|
||||||
|
public boolean mustQuit;
|
||||||
|
public ServerErrorException(String title, String message, String errorType, boolean mustQuit){
|
||||||
|
super("The server issued an error");
|
||||||
|
this.message=message;
|
||||||
|
this.title=title;
|
||||||
|
this.errorType = errorType;
|
||||||
|
this.mustQuit=mustQuit;
|
||||||
|
}
|
||||||
|
}
|
231
WallPost/src/Window.java
Normal file
231
WallPost/src/Window.java
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.ListSelectionEvent;
|
||||||
|
import javax.swing.event.ListSelectionListener;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.FocusEvent;
|
||||||
|
import java.awt.event.FocusListener;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class Window extends JFrame implements ActionListener {
|
||||||
|
private JPanel auth, list, viewOne, mine;
|
||||||
|
private JLabel labelUsername, labelPassword, postHeader;
|
||||||
|
private JTextField username, titleField;
|
||||||
|
private JPasswordField password;
|
||||||
|
private JButton signIn, signUp, make, send, backList,backList2;
|
||||||
|
private JScrollPane TablePane, textViewPane, textEditPane,postHeaderPane;
|
||||||
|
private JTable table;
|
||||||
|
private JTextArea view, write;
|
||||||
|
private DefaultTableModel tb;
|
||||||
|
private ServerConnection server;
|
||||||
|
private PostList PL;
|
||||||
|
private Post CP;
|
||||||
|
public Window() throws IOException {
|
||||||
|
initComponents();
|
||||||
|
server= new ServerConnection(this);
|
||||||
|
PL=null;
|
||||||
|
}
|
||||||
|
public void initComponents(){
|
||||||
|
|
||||||
|
auth=new JPanel();
|
||||||
|
labelUsername= new JLabel("Username");
|
||||||
|
labelPassword=new JLabel("Password");
|
||||||
|
username = new JTextField(15);
|
||||||
|
password = new JPasswordField(15);
|
||||||
|
signIn=new JButton("Sign In");
|
||||||
|
signUp=new JButton("Sign Up");
|
||||||
|
auth.setLayout(new GridLayout(3,2));
|
||||||
|
|
||||||
|
|
||||||
|
auth.add(labelUsername);
|
||||||
|
auth.add(username);
|
||||||
|
|
||||||
|
auth.add(labelPassword);
|
||||||
|
auth.add(password);
|
||||||
|
|
||||||
|
auth.add(signIn);
|
||||||
|
|
||||||
|
auth.add(signUp);
|
||||||
|
|
||||||
|
|
||||||
|
list=new JPanel();
|
||||||
|
Object[][] data = {};
|
||||||
|
String[] columnNames = {"User","Title","Date"};
|
||||||
|
tb=new DefaultTableModel(data,columnNames);
|
||||||
|
table = new JTable(tb);
|
||||||
|
TablePane= new JScrollPane(table);
|
||||||
|
make=new JButton("Write");
|
||||||
|
|
||||||
|
list.setLayout(new GridLayout(2,1));
|
||||||
|
|
||||||
|
list.add(TablePane);
|
||||||
|
list.add(make);
|
||||||
|
|
||||||
|
send= new JButton("Send");
|
||||||
|
|
||||||
|
this.setLayout(new FlowLayout());
|
||||||
|
//this.add(list,new GridBagConstraints());
|
||||||
|
viewOne= new JPanel();
|
||||||
|
view= new JTextArea(15,50);
|
||||||
|
backList2= new JButton("Back To list");
|
||||||
|
textViewPane= new JScrollPane(view);
|
||||||
|
postHeader=new JLabel("Title, details");
|
||||||
|
postHeaderPane=new JScrollPane(postHeader, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
||||||
|
viewOne.setLayout(new GridLayout(3,1));
|
||||||
|
|
||||||
|
viewOne.add(postHeaderPane);
|
||||||
|
viewOne.add(textViewPane);
|
||||||
|
viewOne.add(backList2);
|
||||||
|
|
||||||
|
mine=new JPanel();
|
||||||
|
titleField=new JTextField(15);
|
||||||
|
titleField.setForeground(Color.GRAY);
|
||||||
|
titleField.setText("Title");
|
||||||
|
titleField.setForeground(Color.GRAY);
|
||||||
|
titleField.addFocusListener(new FocusListener() {
|
||||||
|
@Override
|
||||||
|
public void focusGained(FocusEvent e) {
|
||||||
|
if (titleField.getText().equals("Title")) {
|
||||||
|
titleField.setText("");
|
||||||
|
titleField.setForeground(Color.BLACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void focusLost(FocusEvent e) {
|
||||||
|
if (titleField.getText().isEmpty()) {
|
||||||
|
titleField.setForeground(Color.GRAY);
|
||||||
|
titleField.setText("Title");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
write=new JTextArea(15,50);
|
||||||
|
write.setForeground(Color.GRAY);
|
||||||
|
write.setText("Body");
|
||||||
|
write.setForeground(Color.GRAY);
|
||||||
|
write.addFocusListener(new FocusListener() {
|
||||||
|
@Override
|
||||||
|
public void focusGained(FocusEvent e) {
|
||||||
|
if (write.getText().equals("Body")) {
|
||||||
|
write.setText("");
|
||||||
|
write.setForeground(Color.BLACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void focusLost(FocusEvent e) {
|
||||||
|
if (write.getText().isEmpty()) {
|
||||||
|
write.setForeground(Color.GRAY);
|
||||||
|
write.setText("Body");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
textEditPane= new JScrollPane(write);
|
||||||
|
|
||||||
|
backList= new JButton("Back To list");
|
||||||
|
mine.setLayout(new GridLayout(4,1));
|
||||||
|
mine.add(titleField);
|
||||||
|
mine.add(textEditPane);
|
||||||
|
mine.add(send);
|
||||||
|
mine.add(backList);
|
||||||
|
|
||||||
|
|
||||||
|
signIn.addActionListener(this);
|
||||||
|
signUp.addActionListener(this);
|
||||||
|
make.addActionListener(this);
|
||||||
|
backList.addActionListener(this);
|
||||||
|
backList2.addActionListener(this);
|
||||||
|
send.addActionListener(this);
|
||||||
|
|
||||||
|
this.add(auth);
|
||||||
|
this.add(list);
|
||||||
|
this.add(viewOne);
|
||||||
|
this.add(mine);
|
||||||
|
list.setVisible(false);
|
||||||
|
viewOne.setVisible(false);
|
||||||
|
mine.setVisible(false);
|
||||||
|
//this.add(auth,new GridBagConstraints());
|
||||||
|
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
|
||||||
|
public void valueChanged(ListSelectionEvent event) {
|
||||||
|
// do some actions here, for example
|
||||||
|
// print first column value from selected row
|
||||||
|
CP=server.fetchPostBodyIfEmpty(PL,table.getSelectedRow());
|
||||||
|
if (CP!= null) {
|
||||||
|
|
||||||
|
|
||||||
|
postHeader.setText(CP.getTitle() + ", written by " + CP.getAuthor() + " at " + CP.getDate());
|
||||||
|
view.setText(CP.getBody());
|
||||||
|
list.setVisible(false);
|
||||||
|
viewOne.setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void main(String args[]) throws IOException {
|
||||||
|
Window window= new Window();
|
||||||
|
window.setSize(600,1000);
|
||||||
|
window.setTitle("WallPost");
|
||||||
|
window.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTable(PostList a) {
|
||||||
|
tb.setRowCount(0);//Imposta il numero di righe a 0 eliminando tutte le righe presenti
|
||||||
|
for (int i = 0; i < a.size(); i++) {
|
||||||
|
Object[] row = {a.get(i).getAuthor(),a.get(i).getTitle(), a.get(i).getDate()};//Crea riga temporanea
|
||||||
|
tb.addRow(row);//aggiungi riga
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if(e.getSource().equals(signIn)){
|
||||||
|
if(server.signIn(username.getText(),new String(password.getPassword()))) {
|
||||||
|
PL=server.fetchPostsFromServer();
|
||||||
|
this.updateTable(PL);
|
||||||
|
auth.setVisible(false);
|
||||||
|
list.setVisible(true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Wrong credentials",
|
||||||
|
"Cannot sign in",
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(e.getSource().equals(signUp)){
|
||||||
|
if(server.signUp(username.getText(),new String(password.getPassword()))) {
|
||||||
|
updt();
|
||||||
|
auth.setVisible(false);
|
||||||
|
list.setVisible(true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"User Taken",
|
||||||
|
"Cannot sign up",
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(e.getSource().equals(make)){
|
||||||
|
list.setVisible(false);
|
||||||
|
mine.setVisible(true);
|
||||||
|
}
|
||||||
|
else if(e.getSource().equals(backList)||e.getSource().equals(backList2)){
|
||||||
|
updt();
|
||||||
|
viewOne.setVisible(false);
|
||||||
|
mine.setVisible(false);
|
||||||
|
list.setVisible(true);
|
||||||
|
}
|
||||||
|
else if(e.getSource().equals(send)){
|
||||||
|
server.publishPost(titleField.getText(),write.getText());
|
||||||
|
updt();
|
||||||
|
mine.setVisible(false);
|
||||||
|
list.setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updt(){
|
||||||
|
PL=server.fetchPostsFromServer();
|
||||||
|
this.updateTable(PL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
11
WallPostServer/WallPostServer.iml
Normal file
11
WallPostServer/WallPostServer.iml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: WallPostServer
|
||||||
|
|
5
WallPostServer/src/HeaderNotFoundException.java
Normal file
5
WallPostServer/src/HeaderNotFoundException.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
public class HeaderNotFoundException extends Exception{
|
||||||
|
public HeaderNotFoundException(){
|
||||||
|
super("Header not found");
|
||||||
|
}
|
||||||
|
}
|
3
WallPostServer/src/META-INF/MANIFEST.MF
Normal file
3
WallPostServer/src/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: WallPostServer
|
||||||
|
|
73
WallPostServer/src/PermanentSorage.java
Normal file
73
WallPostServer/src/PermanentSorage.java
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class PermanentSorage extends Thread{
|
||||||
|
public UserList getUList() {
|
||||||
|
return UList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PostList getPList() {
|
||||||
|
return PList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserList UList;
|
||||||
|
private PostList PList;
|
||||||
|
private FileInputStream FIn=null;
|
||||||
|
private ObjectInputStream ObjIn=null;
|
||||||
|
private boolean firstTime;
|
||||||
|
public PermanentSorage(UserList UList, PostList PList) {
|
||||||
|
this.UList=UList;
|
||||||
|
this.PList=PList;
|
||||||
|
try {
|
||||||
|
File f = new File("SAVE.DAT");
|
||||||
|
if(!f.exists()) {
|
||||||
|
this.firstTime= f.createNewFile();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FIn = new FileInputStream(f);
|
||||||
|
ObjIn = new ObjectInputStream(FIn);
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void loadFromDisk(){
|
||||||
|
try {
|
||||||
|
if(!firstTime) {
|
||||||
|
SaveContainer c = (SaveContainer) ObjIn.readObject();
|
||||||
|
this.UList = c.getUl();
|
||||||
|
this.PList = c.getPl();
|
||||||
|
ObjIn.close();
|
||||||
|
FIn.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(){
|
||||||
|
while(true) {
|
||||||
|
try {
|
||||||
|
System.out.println("STARTING SAVE");
|
||||||
|
FileOutputStream FOut= new FileOutputStream(new File("SAVE.DAT"));
|
||||||
|
ObjectOutputStream ObjOut= new ObjectOutputStream(FOut);
|
||||||
|
ObjOut.writeObject(new SaveContainer(UList,PList));
|
||||||
|
FOut.close();
|
||||||
|
Thread.sleep(60000);//10 sec
|
||||||
|
System.out.println("END SAVE");
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
WallPostServer/src/Post.java
Normal file
37
WallPostServer/src/Post.java
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Post implements Serializable {
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBody() {
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String title, body,author, date;
|
||||||
|
private int id;
|
||||||
|
public void setBody(String body) {
|
||||||
|
this.body = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Post(String title, String body, String author, String date, int id){
|
||||||
|
this.title=title;
|
||||||
|
this.body=body;
|
||||||
|
this.author=author;
|
||||||
|
this.date=date;
|
||||||
|
this.id=id;
|
||||||
|
}
|
||||||
|
}
|
18
WallPostServer/src/PostList.java
Normal file
18
WallPostServer/src/PostList.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class PostList extends ArrayList<Post> implements Serializable {
|
||||||
|
public int getNewId(){
|
||||||
|
int u;
|
||||||
|
Random r = new Random();
|
||||||
|
u=r.nextInt();
|
||||||
|
for(int i=0;i<this.size();i++){
|
||||||
|
u=r.nextInt();
|
||||||
|
if(this.get(i).getId()==u){
|
||||||
|
return this.getNewId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
}
|
27
WallPostServer/src/SaveContainer.java
Normal file
27
WallPostServer/src/SaveContainer.java
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class SaveContainer implements Serializable {
|
||||||
|
public UserList getUl() {
|
||||||
|
return ul;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUl(UserList ul) {
|
||||||
|
this.ul = ul;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PostList getPl() {
|
||||||
|
return pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPl(PostList pl) {
|
||||||
|
this.pl = pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserList ul;
|
||||||
|
private PostList pl;
|
||||||
|
public SaveContainer(UserList ul, PostList pl){
|
||||||
|
this.ul=ul;
|
||||||
|
this.pl=pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
201
WallPostServer/src/ServerThread.java
Normal file
201
WallPostServer/src/ServerThread.java
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class ServerThread extends Thread {
|
||||||
|
protected Socket socket;
|
||||||
|
protected UserList UList;
|
||||||
|
protected PostList PList;
|
||||||
|
protected ArrayList<String> headers, values;
|
||||||
|
public ServerThread(Socket clientSocket,UserList UList,PostList PList) {
|
||||||
|
this.socket = clientSocket;
|
||||||
|
this.UList=UList;
|
||||||
|
this.PList=PList;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
TITLE
|
||||||
|
END
|
||||||
|
TEXT
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
TITLE
|
||||||
|
END
|
||||||
|
TEXT
|
||||||
|
END
|
||||||
|
QUIT
|
||||||
|
QUIT
|
||||||
|
|
||||||
|
*/
|
||||||
|
private String sanitize(String a){
|
||||||
|
return a.replaceAll("FOLLOWS","follows").replaceAll("END","END");
|
||||||
|
}
|
||||||
|
private synchronized UserList accessUserList(){
|
||||||
|
return this.UList;
|
||||||
|
}
|
||||||
|
private synchronized PostList accessPostList(){
|
||||||
|
return this.PList;
|
||||||
|
}
|
||||||
|
public String valueByHeader(String header) throws HeaderNotFoundException {
|
||||||
|
for(int i=0;i<headers.size();i++){
|
||||||
|
if(headers.get(i).equals(header)){
|
||||||
|
return values.get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new HeaderNotFoundException();
|
||||||
|
}
|
||||||
|
public void run() {
|
||||||
|
InputStream inp = null;
|
||||||
|
BufferedReader in = null;
|
||||||
|
DataOutputStream out = null;
|
||||||
|
try {
|
||||||
|
inp = socket.getInputStream();
|
||||||
|
in = new BufferedReader(new InputStreamReader(inp));
|
||||||
|
out = new DataOutputStream(socket.getOutputStream());
|
||||||
|
} catch (IOException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String line,action=null,name="USER";
|
||||||
|
headers= new ArrayList<String>();
|
||||||
|
values= new ArrayList<String>();
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
line = in.readLine();
|
||||||
|
if ((line == null) || line.equalsIgnoreCase("QUIT")) {
|
||||||
|
socket.close();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(line.startsWith("ACTION")) {
|
||||||
|
headers.clear();
|
||||||
|
values.clear();
|
||||||
|
action=line.split(" ", 2)[1];
|
||||||
|
while(!line.equals("END")){
|
||||||
|
if(line.startsWith("FOLLOWS")){
|
||||||
|
headers.add(line.split(" ", 2)[1]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(!line.startsWith("ACTION")) {
|
||||||
|
values.add(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line=in.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(line.equals("END")){
|
||||||
|
if(action.equals("signIn")){
|
||||||
|
UserList u=accessUserList();
|
||||||
|
boolean access= u.signIn(new User(valueByHeader("username"),valueByHeader("password")));
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("FOLLOWS status\n");
|
||||||
|
if(access){
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
name=valueByHeader("username");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
out.writeBytes("NO\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(action.equals("signUp")){
|
||||||
|
UserList u=accessUserList();
|
||||||
|
boolean access= u.signUp(new User(valueByHeader("username"),valueByHeader("password")));
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("FOLLOWS status\n");
|
||||||
|
if(access){
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
name=valueByHeader("username");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
out.writeBytes("NO\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(name.equals("DEFAULT")){
|
||||||
|
out.writeBytes("ERROR\n" +
|
||||||
|
"Authentication Error\n" +
|
||||||
|
"END\n" +
|
||||||
|
"You must log in" +
|
||||||
|
"END\n" +
|
||||||
|
"QUIT\n" +
|
||||||
|
"QUIT\n");
|
||||||
|
}
|
||||||
|
else if(action.equals("listPosts")){
|
||||||
|
|
||||||
|
PostList p= accessPostList();
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
for(int i=0;i<p.size();i++){
|
||||||
|
//Post c= p.get(i);
|
||||||
|
out.writeBytes("FOLLOWS POST-Id-"+String.valueOf(i) +"\n"+
|
||||||
|
sanitize(String.valueOf(p.get(i).getId()))+"\n" +
|
||||||
|
"FOLLOWS POST-Title-"+String.valueOf(i) +"\n"+
|
||||||
|
sanitize(p.get(i).getTitle())+"\n" +
|
||||||
|
"FOLLOWS POST-Author-"+String.valueOf(i) +"\n"+
|
||||||
|
sanitize(p.get(i).getAuthor())+"\n" +
|
||||||
|
"FOLLOWS POST-Date-"+String.valueOf(i) +"\n"+
|
||||||
|
sanitize(p.get(i).getDate())+"\n");
|
||||||
|
}
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
}
|
||||||
|
else if(action.equals("getPostBody")){
|
||||||
|
PostList p= accessPostList();
|
||||||
|
Post a= new Post("Error","Post not found","Server","01/01/1970",-1);
|
||||||
|
for(int i=0;i<p.size();i++){
|
||||||
|
if(p.get(i).getId()==Integer.parseInt(this.valueByHeader("POST-Id"))){
|
||||||
|
a=p.get(i);
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("FOLLOWS body\n");
|
||||||
|
out.writeBytes(a.getBody()+"\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(action.equals("sendPost")){
|
||||||
|
int ID=this.accessPostList().getNewId();
|
||||||
|
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
|
||||||
|
Date date = new Date();
|
||||||
|
Post p= new Post(this.valueByHeader("POST-Title"),this.valueByHeader("POST-Body"),name,dateFormat.format(date),ID);
|
||||||
|
PostList pl= accessPostList();
|
||||||
|
pl.add(p);
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("FOLLOWS status\n");
|
||||||
|
out.writeBytes("OK\n");
|
||||||
|
out.writeBytes("END\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//out.writeBytes(line + "\n\r");
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
} catch (HeaderNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
try {
|
||||||
|
out.writeBytes("ERROR\n" +
|
||||||
|
"Request Error\n" +
|
||||||
|
"END\n" +
|
||||||
|
"The server received a malformed request\n" +
|
||||||
|
"END\n" +
|
||||||
|
"END\n" +
|
||||||
|
"END\n");
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
WallPostServer/src/User.java
Normal file
25
WallPostServer/src/User.java
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class User implements Serializable {
|
||||||
|
private String username, password;
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
public User(String username, String password){
|
||||||
|
this.username=username;
|
||||||
|
this.password=password;
|
||||||
|
}
|
||||||
|
}
|
24
WallPostServer/src/UserList.java
Normal file
24
WallPostServer/src/UserList.java
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class UserList extends ArrayList<User> implements Serializable{
|
||||||
|
public boolean signUp(User a){
|
||||||
|
for(int i=0;i<this.size();i++){
|
||||||
|
if(this.get(i).getUsername().equals(a.getUsername())){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.add(a);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean signIn(User a){
|
||||||
|
|
||||||
|
for(int i=0;i<this.size();i++){
|
||||||
|
if(this.get(i).getUsername().equals(a.getUsername()) && this.get(i).getPassword().equals(a.getPassword())){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
34
WallPostServer/src/WallPostServer.java
Normal file
34
WallPostServer/src/WallPostServer.java
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
public class WallPostServer {
|
||||||
|
|
||||||
|
static final int PORT = 5555;
|
||||||
|
public static void main(String args[]) {
|
||||||
|
ServerSocket serverSocket = null;
|
||||||
|
Socket socket = null;
|
||||||
|
UserList UList= new UserList();
|
||||||
|
PostList PList= new PostList();
|
||||||
|
/* PermanentSorage ps=new PermanentSorage(UList,PList);
|
||||||
|
ps.loadFromDisk();
|
||||||
|
UList=ps.getUList();
|
||||||
|
PList=ps.getPList();
|
||||||
|
ps.start();*/
|
||||||
|
try {
|
||||||
|
serverSocket = new ServerSocket(PORT);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
socket = serverSocket.accept();
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("I/O error: " + e);
|
||||||
|
}
|
||||||
|
// new thread for a client
|
||||||
|
new ServerThread(socket,UList,PList).start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user