/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * 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 hr.fer.zemris.vhdllab.service.workspace; import hr.fer.zemris.vhdllab.entity.File; import hr.fer.zemris.vhdllab.entity.PreferencesFile; import hr.fer.zemris.vhdllab.entity.Project; import hr.fer.zemris.vhdllab.service.hierarchy.Hierarchy; import hr.fer.zemris.vhdllab.util.EntityUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.Validate; public final class Workspace implements Serializable { private static final long serialVersionUID = -2455644044788201509L; private final Map<Project, ProjectMetadata> projectMetadata; private transient List<Project> projects; private final Set<File> predefinedFiles; private final List<PreferencesFile> preferencesFiles; public Workspace(Map<Project, ProjectMetadata> projectMetadata, Set<File> predefinedFiles, List<PreferencesFile> preferencesFiles) { Validate.notNull(projectMetadata, "Project metadata can't be null"); Validate.notNull(predefinedFiles, "Predefined files can't be null"); Validate.notNull(preferencesFiles, "Preferences files can't be null"); this.projectMetadata = projectMetadata; EntityUtils.setNullFiles(this.projectMetadata.keySet()); this.predefinedFiles = EntityUtils.cloneFiles(predefinedFiles); this.preferencesFiles = EntityUtils.cloneFiles(preferencesFiles); } public int getProjectCount() { return projectMetadata.size(); } public List<Project> getProjects() { if (projects == null) { projects = new ArrayList<Project>(projectMetadata.keySet()); } return projects; } public void addProject(Project project) { Validate.notNull(project, "Project can't be null"); projectMetadata.put(project, new ProjectMetadata(project)); if (projects != null) { int index = projects.indexOf(project); if(index == -1) { projects.add(project); } else { projects.set(index, project); } } } public void removeProject(Project project) { Validate.notNull(project, "Project can't be null"); projectMetadata.remove(project); if (projects != null) { projects.remove(project); } } public void addFile(File file, Hierarchy hierarchy) { Validate.notNull(file, "File can't be null"); ProjectMetadata metadata = getMetadata(file.getProject()); Validate.notNull(metadata, "Project must be opened:" + file.getProject()); metadata.addFile(file); metadata.setHierarchy(hierarchy); } public void removeFile(File file, Hierarchy hierarchy) { Validate.notNull(file, "File can't be null"); ProjectMetadata metadata = getMetadata(file.getProject()); Validate.notNull(metadata, "Project must be opened:" + file.getProject()); metadata.removeFile(file); metadata.setHierarchy(hierarchy); } public Hierarchy getHierarchy(Project project) { ProjectMetadata metadata = getMetadata(project); if (metadata == null) { return null; } return metadata.getHierarchy(); } public Set<File> getFiles(Project project) { ProjectMetadata metadata = getMetadata(project); if (metadata == null) { return null; } return metadata.getFiles(); } private ProjectMetadata getMetadata(Project project) { Validate.notNull(project, "Project can't be null"); return projectMetadata.get(project); } public Set<File> getPredefinedFiles() { return predefinedFiles; } public List<PreferencesFile> getPreferencesFiles() { return preferencesFiles; } @Override public String toString() { StringBuilder sb = new StringBuilder(2000); sb.append("Project metadata:{\n"); for (int i = 0; i < getProjectCount(); i++) { Project project = getProjects().get(i); ProjectMetadata metadata = getMetadata(project); sb.append("*** ").append(i).append(" = ").append(project); sb.append(" {\n"); if(metadata != null) { sb.append(metadata); } else { sb.append("metadata=null\n"); } sb.append("}\n"); } sb.append("}//end metadata\nPredefined files:{"); for (File predefined : getPredefinedFiles()) { sb.append(predefined.getName()).append(","); } sb.append("}\nPreferences files:{"); for (PreferencesFile preferences : getPreferencesFiles()) { sb.append(preferences.getName()).append(","); } sb.append("}"); return sb.toString(); } }