создание объектов из файла с помощью regrex, а затем реализация исполняемого интерфейса java - PullRequest
0 голосов
/ 08 мая 2020

Я не могу понять, где я ошибаюсь в этом java задании. Требуется создавать объекты из текстового файла с помощью regrex, java Reflection и getContructor (). Как только объект создан, запускается поток. Я успешно создал объекты, жестко закодировав аргументы непосредственно в параметры, однако, когда я читаю строки из текстового файла с использованием регулярных выражений, объекты не будут создавать. Ниже приведен мой код, начинающийся с моего основного метода:

public static void main(String[] args) {
        try {
            String option = args[0];
            String filename = args[1];

            if ( !(option.equals("-f")) && !(option.equals("-d")) ) {
                System.out.println("Invalid option");
                printUsage();
            }

            GreenhouseControls gc = new GreenhouseControls();

            if (option.equals("-f"))  {
                addEvent(new Restart(0,filename));
            }

            gc.run();

            // Condition added for step 4.5, creates greenhouse.Restore object and deserializes object in restoreSystem method
            if (option.equals("-d"))  {
                Restore restore = new Restore(filename);
                restore.restoreSystem();
            }
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Invalid number of parameters");
            printUsage();
        }
    }
}

Проблема существует в моем классе Restart, образец которого приведен ниже.

import tme4.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Restart extends Event {
    String eventsFile;
    public Restart(long delayTime, String filename) {
        super(delayTime);
        eventsFile = filename;
    }
        @Override
    public void run() {
        start();
        System.out.println("Restarting system..");
            String eventName;                       // member variable to hold String value specified in text file
            long time;                              // member variable to hold type long value in text file
            int rings = 0;
            File f = new File(eventsFile);
            // try and catch blocks added for exception purposes
            try {
                // Scanner Object created to read information in the file whose pathway is specified by variable f
                Scanner sc = new Scanner(f);
                // While loop to iterate through each line in text file
                while (sc.hasNextLine()) {
                    // Patter and Matcher Objects created to evaluate each line in file based on regular expression
                    Pattern pat = Pattern.compile("Event=(?<eventName>[^,]+?),time=(?<time>[\\d]+)(,rings=(?<rings>[\\d]+))?");
                    Matcher mat = pat.matcher(sc.nextLine());
                    // While loop to implement Matcher.find() method assigning values to member variables based on
                    // patters found using regular expression provided through Pattern.compile() parameters
                    while (mat.find()) {
                        eventName = mat.group("eventName");
                        time = Long.parseLong(mat.group("time"));
                        // if statement to evaluate potential rings attribute for greenhouse.Bell event
                        if (mat.group("rings") != null) {
                            rings = Integer.parseInt(mat.group("rings"));
                            Bell.setRings(rings);
                        }
                        // create objects from text file then add to eventList
                        try {
                            Class<?> td = Class.forName(eventName);
                            Constructor<?> constructor = td.getConstructor(long.class);
                            Event event = (Event) constructor.newInstance(time);
                            Controller.addEvent(event);
                        } catch(ClassNotFoundException | NoSuchMethodException e){
                            System.err.println("Object not created..");
                        } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    }
                }// end of while
            }// end of while
            catch (IOException ex) {
                ex.printStackTrace();
            }
    }
}

Обратите внимание, что используемое регулярное выражение работало в моем последнее задание, за исключением того, что мне не нужно было создавать объекты таким образом. Я просто использовал ключевое слово new в случае оператора switch. Я также включу свой класс контроллера и классы событий ниже ..

package tme4;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public abstract class Controller implements Serializable{
    // A class from java.util to hold Event objects:

    public static List<Event> eventList = new ArrayList<>();
    public static void addEvent(Event c) {
        eventList.add(c);
    }
    public void run(){
        ExecutorService exec = Executors.newCachedThreadPool();
        if(eventList.size() == 1){
            exec.submit(eventList.get(0));
            eventList.remove(eventList.get(0));
        } else {
            for(Event e : eventList){
                exec.submit(e);
            }
        }
        exec.shutdown();
    }
    // abstract method created for implementation in GreenhouseControls
    public abstract void shutdown();
} 
import java.io.Serializable;
public abstract class Event implements Serializable,Runnable{
    protected long delayTime;
    public String eventName;
    protected long eventTime;

    private static volatile boolean suspend = false;

    public Event(){}
    public Event(long delayTime) {
        this.delayTime = delayTime;
        start();
    }

    public void start() { // Allows restarting
        eventTime = System.currentTimeMillis() + delayTime;
    }
    public boolean ready() {
        return System.currentTimeMillis() >= eventTime;
    }
    public synchronized void isSuspend() throws InterruptedException {
        while(!suspend)
            wait();
    }

    public synchronized void suspend(){
        suspend = true;
        notifyAll();
    }
    public synchronized void resume(){
        suspend = false;
        notifyAll();
    }
    // setters and getters to set and retrieve field values
    public long getEventTime(){
        return eventTime;
    }
    public void setEventTime(long etime){
        this.eventTime = etime;
    }
    public long getDelayTime(){
        return delayTime;
    }
    public void setDelayTime(long dTime){ this.delayTime = dTime; }
    public void setEventName(String newEventName){
        this.eventName = newEventName;
    }
    public String getEventName(){
        return eventName;
    }
    @Override
    public void run() {
        try {
            synchronized(this){
                while(suspend){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            Thread.sleep(eventTime);
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
        this.start();
    }
}

И кусок одного из подклассов, расширяющих событие .. моя консоль выглядит так ... enter image description here

enter image description here

...