/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed 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.deidentifier.arx.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.deidentifier.arx.AttributeType.Hierarchy;
import org.deidentifier.arx.DataDefinition;
import org.deidentifier.arx.DataHandle;
import org.deidentifier.arx.gui.model.Model;
import org.deidentifier.arx.gui.model.ModelEvent;
/**
* Class for creating debug data.
*
* @author Fabian Prasser
*/
public class DebugData {
/** TODO */
private static final int MAX_BUFFER_SIZE = 1000;
/** TODO */
private List<String> eventBuffer = new ArrayList<String>();
/**
* Adds an event to the buffer.
*
* @param event
*/
public void addEvent(ModelEvent event) {
this.eventBuffer.add(event.toString());
if (this.eventBuffer.size() > MAX_BUFFER_SIZE) {
this.eventBuffer.remove(0);
}
}
/**
* Clears the event log.
*/
public void clearEventLog() {
this.eventBuffer.clear();
}
/**
* Returns a string representation of a definition.
*
* @param definition
* @return
*/
private String getDebugData(DataDefinition definition){
StringBuilder builder = new StringBuilder();
builder.append("DataDefinition@").append(definition.hashCode()); //$NON-NLS-1$
builder.append(definition.isLocked() ? " [Locked]\n" : "\n"); //$NON-NLS-1$ //$NON-NLS-2$
return builder.toString();
}
/**
* Returns a string representation of a hierarchy.
*
* @param hierarchy
* @return
*/
private String getDebugData(Hierarchy hierarchy){
if (hierarchy==null || hierarchy.getHierarchy()==null || hierarchy.getHierarchy().length==0) return "empty"; //$NON-NLS-1$
else return "height="+hierarchy.getHierarchy()[0].length; //$NON-NLS-1$
}
/**
* Returns a string representation of a handle.
*
* @param prefix
* @param handle
* @param view
* @return
*/
private String getDebugData(String prefix, DataHandle handle, boolean view){
StringBuilder builder = new StringBuilder();
builder.append("DataHandle@").append(handle.hashCode()); //$NON-NLS-1$
if (handle.isOrphaned()) {
builder.append(" [Orphaned]\n"); //$NON-NLS-1$
} else {
builder.append("\n"); //$NON-NLS-1$
builder.append(prefix).append("DataDefinition@").append(handle.getDefinition().hashCode()); //$NON-NLS-1$
builder.append(handle.getDefinition().isLocked() ? " [Locked]\n" : "\n"); //$NON-NLS-1$ //$NON-NLS-2$
if (!view) {
builder.append(prefix).append("View").append(getDebugData(prefix+"View", handle.getView(), true)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return builder.toString();
}
/**
* Returns some debug data.
*
* @param model
* @return
*/
protected String getData(Model model){
if (model == null ||
model.getInputConfig() == null ||
model.getInputConfig().getInput() == null) {
return "No debug data available"; //$NON-NLS-1$
}
StringBuilder builder = new StringBuilder();
builder.append("Handles\n"); //$NON-NLS-1$
builder.append(" - Definitions\n"); //$NON-NLS-1$
builder.append(" * Input : ").append(getDebugData(model.getInputDefinition())); //$NON-NLS-1$
builder.append(" * Output: ").append(getDebugData(model.getOutputDefinition())); //$NON-NLS-1$
builder.append(" - Input\n"); //$NON-NLS-1$
builder.append(" * Input : ").append(getDebugData(" ", model.getInputConfig().getInput().getHandle(), false)); //$NON-NLS-1$ //$NON-NLS-2$
if (model.getOutput() != null) {
builder.append(" - Output\n"); //$NON-NLS-1$
builder.append(" * Input : ").append(getDebugData(" ", model.getOutputConfig().getInput().getHandle(), false)); //$NON-NLS-1$ //$NON-NLS-2$
builder.append(" * Output: ").append(getDebugData(" ", model.getOutput(), false)); //$NON-NLS-1$ //$NON-NLS-2$
}
builder.append("\n"); //$NON-NLS-1$
if (model.getInputConfig() != null || model.getOutputConfig() != null){
builder.append("Hierarchies\n"); //$NON-NLS-1$
if (model.getInputConfig() != null){
builder.append(" - Input\n"); //$NON-NLS-1$
for (Entry<String, Hierarchy> entry : model.getInputConfig().getHierarchies().entrySet()) {
builder.append(" * ").append(entry.getKey()).append(": ").append(getDebugData(entry.getValue())).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
if (model.getOutputConfig() != null){
builder.append(" - Input\n"); //$NON-NLS-1$
for (Entry<String, Hierarchy> entry : model.getOutputConfig().getHierarchies().entrySet()) {
builder.append(" * ").append(entry.getKey()).append(": ").append(getDebugData(entry.getValue())).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
builder.append("\n"); //$NON-NLS-1$
}
builder.append("Visualization\n"); //$NON-NLS-1$
builder.append(" - Hidden : ").append(!model.isVisualizationEnabled()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
builder.append(" - Hidden at: ").append(model.getMaximalSizeForComplexOperations()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
builder.append("\n"); //$NON-NLS-1$
builder.append("Event log\n"); //$NON-NLS-1$
if (eventBuffer.isEmpty()) {
builder.append(" - Empty\n"); //$NON-NLS-1$
} else {
for (String s : eventBuffer){
builder.append(s).append("\n"); //$NON-NLS-1$
}
}
return builder.toString();
}
}