class WorkspaceInformationImpl implements WorkspaceInformation {

    //Lookup
    private final transient List<PropertyChangeListener> listeners = new ArrayList<>();
    private String name;
    private Status status = Status.CLOSED;
    private String source;

    public WorkspaceInformationImpl(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        String oldValue = this.name;
        this.name = name;
        fireChangeEvent(WorkspaceInformation.EVENT_RENAME, oldValue, name);
    }

    public Status getStatus() {
        return status;
    }

    @Override
    public String getSource() {
        return source;
    }

    public void setSource(String source) {<FILL_FUNCTION_BODY>}

    @Override
    public boolean hasSource() {
        return source != null;
    }

    public void open() {
        Status oldValue = status;
        status = Status.OPEN;
        fireChangeEvent(WorkspaceInformation.EVENT_OPEN, oldValue, status);
    }

    public void close() {
        Status oldValue = status;
        status = Status.CLOSED;
        fireChangeEvent(WorkspaceInformation.EVENT_CLOSE, oldValue, status);
    }

    public void invalid() {
        this.status = Status.INVALID;
    }

    @Override
    public boolean isOpen() {
        return status == Status.OPEN;
    }

    @Override
    public boolean isClosed() {
        return status == Status.CLOSED;
    }

    @Override
    public boolean isInvalid() {
        return status == Status.INVALID;
    }

    @Override
    public void addChangeListener(PropertyChangeListener listener) {
        listeners.add(listener);
    }

    @Override
    public void removeChangeListener(PropertyChangeListener listener) {
        listeners.remove(listener);
    }

    public void fireChangeEvent(String eventName, Object oldValue, Object newValue) {
        if ((oldValue == null && newValue != null) || (oldValue != null && newValue == null)
            || (oldValue != null && !oldValue.equals(newValue))) {
            PropertyChangeEvent event = new PropertyChangeEvent(this, eventName, oldValue, newValue);
            for (PropertyChangeListener listener : listeners) {
                listener.propertyChange(event);
            }
        }
    }

    public enum Status {

        OPEN, CLOSED, INVALID
    }
}

        String oldValue = this.source;
        this.source = source;
        fireChangeEvent(WorkspaceInformation.EVENT_SET_SOURCE, oldValue, source);
    
<no_super_class>