/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.kie.workbench.common.screens.explorer.backend.server;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.repositories.Repository;
import org.kie.workbench.common.screens.explorer.model.FolderItem;
import org.uberfire.backend.vfs.Path;
import org.uberfire.commons.data.Pair;
import org.uberfire.commons.data.Triple;
public class UserExplorerData {
private OrganizationalUnit organizationalUnit = null;
private Map<String, Object> content = new HashMap<String, Object>();
private Map<String, Set<String>> organizationalUnitKeys = new HashMap<String, Set<String>>();
private Map<String, Set<String>> repositoryKeys = new HashMap<String, Set<String>>();
private Map<String, Set<String>> projectKeys = new HashMap<String, Set<String>>();
public UserExplorerData() {
}
public OrganizationalUnit getOrganizationalUnit() {
return organizationalUnit;
}
public Repository get( final OrganizationalUnit organizationalUnit ) {
if ( organizationalUnit == null ) {
return null;
}
final Object obj = content.get( organizationalUnit.getName() );
if ( obj != null && obj instanceof Repository ) {
return (Repository) obj;
}
return null;
}
public Project get( final OrganizationalUnit organizationalUnit,
final Repository repository ) {
if ( organizationalUnit == null || repository == null ) {
return null;
}
final Object obj = content.get( Pair.newPair( organizationalUnit.getName(), repository.getRoot() ).toString() );
if ( obj != null && obj instanceof Project ) {
return (Project) obj;
}
return null;
}
public FolderItem getFolderItem( final OrganizationalUnit organizationalUnit,
final Repository repository,
final Project project ) {
if ( organizationalUnit == null || repository == null || project == null ) {
return null;
}
final Object obj = content.get( new FolderItemKey( organizationalUnit.getName(), repository.getRoot(), project.getPomXMLPath().toURI() ).toString() );
if ( obj != null && obj instanceof FolderItem ) {
return (FolderItem) obj;
}
return null;
}
public Package getPackage( final OrganizationalUnit organizationalUnit,
final Repository repository,
final Project project ) {
if ( organizationalUnit == null || repository == null || project == null ) {
return null;
}
final Object obj = content.get( new PackageKey( organizationalUnit.getName(), repository.getRoot(), project.getPomXMLPath().toURI() ).toString() );
if ( obj != null && obj instanceof Package ) {
return (Package) obj;
}
return null;
}
public void setOrganizationalUnit( OrganizationalUnit organizationalUnit ) {
this.organizationalUnit = organizationalUnit;
}
public void addRepository( final OrganizationalUnit organizationalUnit,
final Repository repository ) {
content.put( organizationalUnit.getName(), repository );
indexOrganizationalUnit( organizationalUnit );
}
public void addProject( final OrganizationalUnit organizationalUnit,
final Repository repository,
final Project project ) {
final String key = Pair.newPair( organizationalUnit.getName(), repository.getRoot() ).toString();
content.put( key, project );
indexOrganizationalUnit( organizationalUnit, key );
indexRepository( repository, key );
}
public void addFolderItem( final OrganizationalUnit organizationalUnit,
final Repository repository,
final Project project,
final FolderItem item ) {
final String key = new FolderItemKey( organizationalUnit.getName(), repository.getRoot(), project.getPomXMLPath().toURI() ).toString();
content.put( key, item );
indexOrganizationalUnit( organizationalUnit, key );
indexRepository( repository, key );
indexProject( project, key );
}
public void addPackage( final OrganizationalUnit organizationalUnit,
final Repository repository,
final Project project,
final Package pkg ) {
final String key = new PackageKey( organizationalUnit.getName(), repository.getRoot(), project.getPomXMLPath().toURI() ).toString();
content.put( key, pkg );
indexOrganizationalUnit( organizationalUnit, key );
indexRepository( repository, key );
indexProject( project, key );
}
private void indexOrganizationalUnit( OrganizationalUnit organizationalUnit ) {
if ( !organizationalUnitKeys.containsKey( organizationalUnit.getName() ) ) {
organizationalUnitKeys.put( organizationalUnit.getName(), new HashSet<String>() );
}
organizationalUnitKeys.get( organizationalUnit.getName() ).add( organizationalUnit.getName() );
}
private void indexOrganizationalUnit( final OrganizationalUnit organizationalUnit,
final String key ) {
if ( !organizationalUnitKeys.containsKey( organizationalUnit.getName() ) ) {
organizationalUnitKeys.put( organizationalUnit.getName(), new HashSet<String>() );
}
organizationalUnitKeys.get( organizationalUnit.getName() ).add( key );
}
private void indexRepository( final Repository repository,
final String key ) {
if ( !repositoryKeys.containsKey( repository.getUri() ) ) {
repositoryKeys.put( repository.getUri(), new HashSet<String>() );
}
repositoryKeys.get( repository.getUri() ).add( key );
}
private void indexProject( final Project project,
final String key ) {
final String projectRef = project.getPomXMLPath().toURI();
if ( !projectKeys.containsKey( projectRef ) ) {
projectKeys.put( projectRef, new HashSet<String>() );
}
projectKeys.get( projectRef ).add( key );
}
public boolean isEmpty() {
return organizationalUnit == null && content.isEmpty();
}
public void deleteOrganizationalUnit( final OrganizationalUnit organizationalUnit ) {
if ( this.organizationalUnit.equals( organizationalUnit ) ) {
this.organizationalUnit = null;
}
if ( organizationalUnitKeys.containsKey( organizationalUnit.getName() ) ) {
for ( final String key2Delete : organizationalUnitKeys.get( organizationalUnit.getName() ) ) {
content.remove( key2Delete );
}
}
}
public void deleteRepository( final Repository repository ) {
if ( repositoryKeys.containsKey( repository.getUri() ) ) {
for ( final String key2Delete : repositoryKeys.get( repository.getUri() ) ) {
content.remove( key2Delete );
}
}
}
public boolean deleteProject( final Project project ) {
boolean changed = false;
final String projectRef = project.getPomXMLPath().toURI();
if ( projectKeys.containsKey( projectRef ) ) {
changed = true;
for ( final String key2Delete : projectKeys.get( projectRef ) ) {
content.remove( key2Delete );
}
}
return changed;
}
private static class FolderItemKey extends Triple<String, String, String> {
public FolderItemKey(String name, Path root, String s3) {
super(name, root.toURI(), s3);
}
@Override
public boolean equals( Object o ) {
if ( o == null ) {
return false;
}
if ( this == o ) {
return true;
}
if ( !( o instanceof FolderItemKey ) ) {
return false;
}
return super.equals( o );
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + FolderItemKey.class.hashCode();
return result;
}
}
private static class PackageKey extends Triple<String, String, String> {
public PackageKey(String name,
Path root,
String s3) {
super(name, root.toURI(), s3);
}
@Override
public boolean equals( Object o ) {
if ( o == null ) {
return false;
}
if ( this == o ) {
return true;
}
if ( !( o instanceof PackageKey ) ) {
return false;
}
return super.equals( o );
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + PackageKey.class.hashCode();
return result;
}
}
}