class WorkspaceColumnsObservers {

    private final GraphModel graphModel;

    private TableObserver nodesTableObserver;
    private TableObserver edgesTableObserver;

    public WorkspaceColumnsObservers(Workspace workspace) {
        this.graphModel = Lookup.getDefault().lookup(GraphController.class).getGraphModel(workspace);
    }

    public synchronized void initialize() {<FILL_FUNCTION_BODY>}

    public synchronized void destroy() {
        if (nodesTableObserver != null) {
            nodesTableObserver.destroy();
            nodesTableObserver = null;
        }
        if (edgesTableObserver != null) {
            edgesTableObserver.destroy();
            edgesTableObserver = null;
        }
    }

    public boolean hasChanges() {
        if (nodesTableObserver == null) {
            return false;//Not initialized
        }

        boolean hasChanges = false;
        hasChanges = processTableObseverChanges(nodesTableObserver) || hasChanges;
        hasChanges = processTableObseverChanges(edgesTableObserver) || hasChanges;

        return hasChanges;
    }

    private boolean processTableObseverChanges(TableObserver observer) {
        return observer.hasTableChanged();
    }
}

        if (nodesTableObserver != null) {
            return;
        }

        nodesTableObserver = graphModel.getNodeTable().createTableObserver(true);
        edgesTableObserver = graphModel.getEdgeTable().createTableObserver(true);
    
<no_super_class>