/*
Copyright 2014 Google Inc. All Rights Reserved.
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 com.google.security.zynamics.binnavi.disassembly;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.security.zynamics.binnavi.Database.Interfaces.SQLProvider;
import com.google.security.zynamics.binnavi.Tagging.CTag;
import com.google.security.zynamics.binnavi.disassembly.views.INaviView;
import com.google.security.zynamics.binnavi.disassembly.views.IViewConfiguration;
import com.google.security.zynamics.zylib.disassembly.GraphType;
import com.google.security.zynamics.zylib.disassembly.ViewType;
import java.util.Date;
import java.util.Set;
public class ViewConfiguration implements IViewConfiguration {
private final SQLProvider provider;
private final INaviView view;
private final ViewType type;
private final int viewId;
private final String name;
private final String description;
private final Date modificationDate;
private final Date creationDate;
private final INaviModule module;
private final Set<CTag> viewTags;
private final boolean staredState;
private final INaviProject project;
private final int edgeCount;
private final int nodeCount;
private final GraphType graphType;
private ViewConfiguration(final Builder builder) {
provider = builder.provider;
view = builder.view;
type = builder.type;
viewId = builder.viewId; // TODO: critical point we need to distinguish between different
// unsaved views!!!
name = builder.name;
description = builder.description;
modificationDate = builder.modificationDate;
creationDate = builder.creationDate;
module = builder.module;
project = builder.project;
viewTags = builder.viewTags;
staredState = builder.staredState;
edgeCount = builder.edgeCount;
nodeCount = builder.nodeCount;
graphType = builder.graphType;
}
public static class Builder {
private final SQLProvider provider;
private final INaviView view;
private final ViewType type;
private int viewId;
private String name;
private String description;
private Date modificationDate;
private Date creationDate;
private INaviModule module;
private Set<CTag> viewTags;
private boolean staredState;
private INaviProject project;
private int edgeCount;
private int nodeCount;
private GraphType graphType;
public Builder(final SQLProvider provider, final INaviView view, final ViewType type) {
this.provider =
Preconditions.checkNotNull(provider, "Error: provider argument can not be null");
this.view = Preconditions.checkNotNull(view, "Error: view argument can not be null");
this.type = Preconditions.checkNotNull(type, "Error: type argument can not be null");
}
public Builder(final ViewConfiguration configuration, final int viewId) {
provider = configuration.provider;
view = configuration.view;
type = configuration.type;
this.viewId = viewId;
name = configuration.name;
description = configuration.description;
modificationDate = configuration.modificationDate;
creationDate = configuration.creationDate;
module = configuration.module;
project = configuration.project;
viewTags = configuration.viewTags;
staredState = configuration.staredState;
edgeCount = configuration.edgeCount;
nodeCount = configuration.nodeCount;
graphType = configuration.graphType;
}
public Builder setId(final int viewId) {
this.viewId = viewId;
return this;
}
public Builder setName(final String name) {
this.name = Preconditions.checkNotNull(name, "Error: name argument can not be null");
return this;
}
public ViewConfiguration build() {
Preconditions.checkArgument(module != null || project != null,
"Error: the final module is not final associated to a final module or final a project");
return new ViewConfiguration(this);
}
public Builder setDescription(final String description) {
this.description =
Preconditions.checkNotNull(description, "Error: description argument can not be null");
return this;
}
public Builder setModificationDate(final Date date) {
modificationDate = Preconditions.checkNotNull(date, "Error: date argument can not be null");
return this;
}
public Builder setCreationDate(final Date date) {
creationDate = Preconditions.checkNotNull(date, "Error: date argument can not be null");
return this;
}
public Builder setModule(final INaviModule module) {
this.module = Preconditions.checkNotNull(module, "Error: module argument can not be null");
return this;
}
public Builder setProject(final INaviProject project) {
this.project = Preconditions.checkNotNull(project, "Error: project argument can not be null");
return this;
}
public Builder setTags(final Set<CTag> tags) {
viewTags = Preconditions.checkNotNull(tags, "Error: tags argument can not be null");
return this;
}
public Builder setStaredState(final boolean staredState) {
this.staredState = staredState;
return this;
}
public Builder setUnloadedEdgeCount(final int edgeCount) {
this.edgeCount = edgeCount;
return this;
}
public Builder setUnloadedNodeCount(final int nodeCount) {
this.nodeCount = nodeCount;
return this;
}
public Builder setGraphType(final GraphType graphType) {
this.graphType =
Preconditions.checkNotNull(graphType, "Error: graphType argument can not be null");
return this;
}
}
@Override
public int getUnloadedEdgeCount() {
return edgeCount;
}
@Override
public Date getCreationDate() {
return creationDate;
}
@Override
public String getDescription() {
return description;
}
@Override
public int getId() {
return viewId;
}
@Override
public Date getModificationDate() {
return modificationDate;
}
@Override
public INaviModule getModule() {
return module;
}
@Override
public String getName() {
return name;
}
@Override
public INaviProject getProject() {
return project;
}
@Override
public ViewType getType() {
return type;
}
@Override
public Set<CTag> getViewTags() {
return viewTags;
}
@Override
public boolean isStared() {
return staredState;
}
@Override
public boolean isTagged() {
return !viewTags.isEmpty();
}
@Override
public boolean isTagged(final CTag tag) {
return Iterables.tryFind(viewTags, new Predicate<CTag>() {
@Override
public boolean apply(final CTag currentTag) {
return currentTag.getId() == tag.getId();
}
}).isPresent();
}
@Override
public void setDescription(final String description) {
throw new IllegalStateException();
}
@Override
public void setId(final int viewId) {
throw new IllegalStateException();
}
@Override
public void setName(final String name) {
throw new IllegalStateException();
}
@Override
public void setNameInternal(final String name) {
throw new IllegalStateException();
}
@Override
public void setDescriptionInternal(final String description) {
throw new IllegalStateException();
}
@Override
public void setStaredInternal(final boolean isStared) {
throw new IllegalStateException();
}
@Override
public void setModificationDateInternal(final Date modificationDate) {
throw new IllegalStateException();
}
@Override
public void setStared(final boolean stared) {
throw new IllegalStateException();
}
@Override
public void tagView(final CTag tag) {
// TODO Auto-generated method stub
}
@Override
public void untagView(final CTag tag) {
// TODO Auto-generated method stub
}
@Override
public void updateModificationDate() {
// TODO Auto-generated method stub
}
@Override
public GraphType getUnloadedGraphType() {
return graphType;
}
@Override
public int getUnloadedNodeCount() {
return nodeCount;
}
}