Pokaż wyniki od 1 do 4 z 4

Wątek: JAVA przypominajka

  1. #1
    Użytkownik Podkręca śrubokrętem Reputacja:   (1) Awatar mihu1993
    Dołączył
    09.2015
    Posty
    14

    JAVA przypominajka

    W ramach ćwiczeń napisałem mini programik dla zapominalskich. Tytułowa przypominajka, (jak nie trudno się domyślić) przypomina o nadchodzących wydarzeniach, wysyłając wiadomość na skrzynke pocztową. Oczywiście, eventy o których chcemy pamiętać umieszczamy w pliku Exelowskim (.xls). Aby program poprawnie działał dane umieszczamy w nastepującej kolejności:
    - pierwsza kolumna: data w formacie yyyy-mm-dd
    - druga kolumna: wydarzenie

    Kod:
    /*pobieramy wydarzenia z pliku,
    przypomnienia dostajemy 2 dni przed*/
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.read.biff.BiffException;
    
    public class CheckDate {
    	String excelFilePath;
    	String excelNameSheet;
    	List<String> myList = new ArrayList<String>();
    	DateDifference diff = new DateDifference();
    	
    	public CheckDate(String path, String sheetName) {
    		excelFilePath = path;
    		excelNameSheet = sheetName;
    	}
    	
    	public List<String> readExcel() throws BiffException, IOException {
    		FileInputStream inputFile = new FileInputStream(excelFilePath);
    		Workbook excelWorkbook = Workbook.getWorkbook(inputFile);
    		Sheet excelSheet = excelWorkbook.getSheet(excelNameSheet);
    		int numberOfRows = excelSheet.getRows();
    		
    		for(int rows = 0; rows < numberOfRows; rows++) {
    			String date = excelSheet.getCell(0, rows).getContents();
    			if(diff.difference(date)) {
    					String dataFromCell = excelSheet.getCell(1, rows).getContents().trim();
    					myList.add(dataFromCell);			 
    			}
    		}
    		return myList;
    	}
    }
    Kod:
    /*sprawdzamy czy rożnica w datach wynosi 2 dni*/
    
    import java.time.LocalDate;
    import java.time.Period;
    import java.time.format.DateTimeParseException;
    
    public class DateDifference {
    	final static int DAYS = 2;
    	
    	public boolean difference(String date) throws DateTimeParseException  {
    		LocalDate now = LocalDate.now();
    		LocalDate next = LocalDate.parse(date);
    		Period period = Period.between(next, now);
    		
    		if(period.getDays() == DAYS) {
    			return true;
    		}
    		else return false;
    	}
    }
    Kod:
    /*funkcja odpowiadająca za wysłanie wiadomości*/
    
    import java.io.IOException;
    import org.apache.commons.mail.DefaultAuthenticator;
    import org.apache.commons.mail.Email;
    import org.apache.commons.mail.EmailException;
    import org.apache.commons.mail.SimpleEmail;
    import jxl.read.biff.BiffException;
    
    public class JavaMail {
    	static String hostName;
    	static String userName;
    	static String userPassword;
    	static String subject;
    	static String fromAddress;
    	static String toAddress; 
    	
    	public JavaMail(String host, String user, String password, String sub, String from, String to) {
    		hostName = host;
    		userName = user;
    		userPassword = password;
    		subject = sub;
    		fromAddress = from;
    		toAddress = to;
    		}
    	
    	public void sendSimpleMail(String list) throws EmailException, BiffException, IOException {
    		Email email = new SimpleEmail();
    		email.setHostName(hostName);
    		email.setSmtpPort(587);
    		email.setAuthenticator(new DefaultAuthenticator(userName, userPassword));
    		email.setDebug(false);
    		email.setFrom(fromAddress);
    		email.setSubject(subject);
    		email.setMsg(list);
    		email.addTo(toAddress);
    		email.send();
    		System.out.println("Mail sent!");
    	}
    }
    Kod:
    import java.io.IOException;
    import java.util.List;
    
    import org.apache.commons.mail.EmailException;
    
    import jxl.read.biff.BiffException;
    
    public class SendMail {
    
    	public static void main(String[] args) throws BiffException, IOException {
    		//excel_path, excel_sheet, host_name, user_name, user_password, from and to
    		//cannot be empty in order to make program work
    		final String TEXT = "Nothing to remind!";
    		final String EXCEL_PATH = "";
    		final String EXCEL_SHEET = "";
    		final String HOST_NAME = "smtp.interia.pl";
    		final String USER_NAME = "";
    		final String USER_PASSWORD = "";
    		final String SUBJECT = "REMINDER";
    		final String FROM = "";
    		final String TO = "";
    		CheckDate read = new CheckDate(EXCEL_PATH, EXCEL_SHEET);
    		JavaMail myMail = new JavaMail(HOST_NAME, USER_NAME, USER_PASSWORD, SUBJECT, FROM, TO);
    		List<String> list = read.readExcel();
    		
    		try {
    			if(list.isEmpty()) {
    				System.out.println(TEXT);
    			} else {
    				myMail.sendSimpleMail("Shame on you, did you really forget about:\n" + list.toString());
    				}
    			} catch (EmailException exception) {
    			exception.printStackTrace();
    			}
    		/*if(!list.isEmpty()) {
    			System.out.println(list);
    			}*/
    		}
    	}
    Aby program uruchamiał się wraz ze startem systemu, należy utworzyć blik .bat o następującej treści:
    @java -jar path_to_the_jar_file. Taki plik umieszczamy w folderze startup.

    Jak coś proszę o jakiś feedback. Dzięki
    Ostatnio edytowane przez mihu1993 ; 03-09-2015 o 21:40

  2. #2
    HWBot Team Entuzjasta overclockingu Reputacja:   (1)
    Dołączył
    02.2012
    Skąd
    Manchester
    Posty
    160
    Dzieki, za ciekawy kod. Wyglada OK.

    Ciezko sie do czego przyczepic, jedynie male uwagi:
    - program rzuci NullPointerException jesli komorka (Cell) 0 lub 1 nie istnieje (ale to niby blad uzytkownika),
    - czesc wyjatkow lapiesz, a czesc rzucasz do systemu z funkcji main()
    - printStackTrace() nie powinno byc uzyte w koncowej aplikacji. Wiadome, ze pomaga to debugowac podczas kodowania, jednak w "koncowym produkcie" powinno byc to zamienienone na user-friendly wiadomosci.
    - problem bedzie jak ktos nie resetuje kompa przez tydzien - kolejna wersja powinna sprawdzac alarmy w petli (bez aktywnego czekania / blokowania watku - uzywajac jakis sprytny timer). Mozna by tez zrobic trzecia kolumne w Excelu - kiedy przypomniec o wydarzeniu.

    Ogolnie - good job!

  3. #3
    Advert Manager Guru overclockingu Reputacja:   (13) Awatar Dawid_S
    Dołączył
    05.2009
    Posty
    6,599
    W main masz konfigurację w kodzie - lepiej zastosować plik properties. Taki plik powinien "leżeć" obok jar. Nawet gdybyś zrobił konfigurację z GUI, to najlepiej robi się to plikami properties.
    Brak systemu logowania - użyj np. Log4j lub innego. Logi zapisuj do pliku, skoro aplikacja działa jako proces w tle.
    Aplikacja nie jest "ciągła", tzn. uruchamiasz cały proces tylko raz. Jak ustawisz to jako program uruchomieniowy, to maile będą słane dopiero przy ponownym uruchomieniu kompa.
    "List<String> list = read.readExcel();" - nie jest to logiczne ;-) . Jeśli byłoby w formie "List<String> lines= excelFile.readAllLines();" to już byłoby w pełni zrozumiałe. Poczytaj książkę "Czysty kod" autorstwa Martina.
    Poza tym pomysł fajny . Pewnie znalazłoby się jeszcez kilka uwag, ale ogólnie ok.

  4. #4
    Użytkownik Podkręca śrubokrętem Reputacja:   (1) Awatar mihu1993
    Dołączył
    09.2015
    Posty
    14
    Dzięki za słowa krytyki. Postaram się wszystko uwzględnić

Tagi dla tego wątku

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •