blob: d467600f2bb9ea6b16d914df60b0e17aed0ac81b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.cpplite.debugger.breakpoints;
import java.beans.PropertyChangeEvent;
import java.util.List;
import java.util.ArrayList;
import org.netbeans.api.debugger.Breakpoint;
import org.netbeans.api.debugger.DebuggerEngine;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.api.debugger.LazyDebuggerManagerListener;
import org.netbeans.api.debugger.Properties;
import org.netbeans.api.debugger.Session;
import org.netbeans.api.debugger.Watch;
import org.netbeans.spi.debugger.DebuggerServiceRegistration;
/**
* Listens on DebuggerManager and:
* - loads all breakpoints & watches on startup
* - listens on all changes of breakpoints and watches (like breakoint / watch
* added / removed, or some property change) and saves a new values
*
* @author Jan Jancura
*/
@DebuggerServiceRegistration(types={LazyDebuggerManagerListener.class})
public class PersistenceManager implements LazyDebuggerManagerListener {
@Override
public Breakpoint[] initBreakpoints () {
Properties p = Properties.getDefault ().getProperties ("debugger").
getProperties (DebuggerManager.PROP_BREAKPOINTS);
Breakpoint[] breakpoints = (Breakpoint[]) p.getArray (
"cpplite",
new Breakpoint [0]
);
for (int i = 0; i < breakpoints.length; i++) {
if (breakpoints[i] == null) {
Breakpoint[] b2 = new Breakpoint[breakpoints.length - 1];
System.arraycopy(breakpoints, 0, b2, 0, i);
if (i < breakpoints.length - 1) {
System.arraycopy(breakpoints, i + 1, b2, i, breakpoints.length - i - 1);
}
breakpoints = b2;
i--;
continue;
}
breakpoints[i].addPropertyChangeListener(this);
}
return breakpoints;
}
@Override
public void initWatches () {
}
@Override
public String[] getProperties () {
return new String [] {
DebuggerManager.PROP_BREAKPOINTS_INIT,
DebuggerManager.PROP_BREAKPOINTS,
};
}
@Override
public void breakpointAdded (Breakpoint breakpoint) {
if (breakpoint instanceof CPPLiteBreakpoint) {
Properties p = Properties.getDefault ().getProperties ("debugger").
getProperties (DebuggerManager.PROP_BREAKPOINTS);
p.setArray (
"cpplite",
getBreakpoints ()
);
breakpoint.addPropertyChangeListener(this);
}
}
@Override
public void breakpointRemoved (Breakpoint breakpoint) {
if (breakpoint instanceof CPPLiteBreakpoint) {
Properties p = Properties.getDefault ().getProperties ("debugger").
getProperties (DebuggerManager.PROP_BREAKPOINTS);
p.setArray (
"cpplite",
getBreakpoints ()
);
breakpoint.removePropertyChangeListener(this);
}
}
@Override
public void watchAdded (Watch watch) {
}
@Override
public void watchRemoved (Watch watch) {
}
@Override
public void propertyChange (PropertyChangeEvent evt) {
if (evt.getSource() instanceof Breakpoint) {
Properties.getDefault ().getProperties ("debugger").
getProperties (DebuggerManager.PROP_BREAKPOINTS).setArray (
"cpplite",
getBreakpoints ()
);
}
}
@Override
public void sessionAdded (Session session) {}
@Override
public void sessionRemoved (Session session) {}
@Override
public void engineAdded (DebuggerEngine engine) {}
@Override
public void engineRemoved (DebuggerEngine engine) {}
private static Breakpoint[] getBreakpoints () {
Breakpoint[] bs = DebuggerManager.getDebuggerManager ().
getBreakpoints ();
int i, k = bs.length;
List<Breakpoint> bb = new ArrayList<>();
for (i = 0; i < k; i++)
// Don't store hidden breakpoints
if (bs[i] instanceof CPPLiteBreakpoint)
bb.add (bs [i]);
bs = new Breakpoint [bb.size ()];
return (Breakpoint[]) bb.toArray (bs);
}
}