2020-03-23 15:35:58 +01:00
|
|
|
/*
|
2024-09-24 09:42:07 +02:00
|
|
|
* Copyright (c) 2020 - present Cloudogu GmbH
|
2010-12-31 16:28:55 +01:00
|
|
|
*
|
2024-09-24 09:42:07 +02:00
|
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
|
|
|
* the terms of the GNU Affero General Public License as published by the Free
|
|
|
|
|
* Software Foundation, version 3.
|
2010-12-31 16:28:55 +01:00
|
|
|
*
|
2024-09-24 09:42:07 +02:00
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
|
|
|
* details.
|
2010-12-31 16:28:55 +01:00
|
|
|
*
|
2024-09-24 09:42:07 +02:00
|
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
|
|
|
* along with this program. If not, see https://www.gnu.org/licenses/.
|
2010-12-31 16:28:55 +01:00
|
|
|
*/
|
|
|
|
|
|
Sorted autocomplete (#1918)
Users, groups, repositories and repository roles have been sorted in the rest layer by default if no other sort option was given. In the layers "below" (aka the manager classes or the dao), the collections have been unsorted. This led to the effect, that the autocomplete resource, which did not sort all values beforehand, returned unsorted results. As a sideeffect, direct matches for an input could occur at a random position or not at all (as reported in #1695), when there were enough other matches.
With this pull request the databases for users, groups, repositories and repository roles will use instances of TreeMap instead of LinkedHashMap internally, so that these values are sorted implicitly (by id respectively name for users, groups and repository roles and namespace/name for repositories).
Due to this change the default sort applied in the rest layer could be removed.
2022-01-18 09:46:10 +01:00
|
|
|
package sonia.scm.group.xml;
|
2010-12-31 16:28:55 +01:00
|
|
|
|
2023-11-29 18:14:03 +01:00
|
|
|
import jakarta.xml.bind.annotation.XmlAccessType;
|
|
|
|
|
import jakarta.xml.bind.annotation.XmlAccessorType;
|
|
|
|
|
import jakarta.xml.bind.annotation.XmlElement;
|
|
|
|
|
import jakarta.xml.bind.annotation.XmlRootElement;
|
|
|
|
|
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
2023-03-21 12:03:51 +01:00
|
|
|
import sonia.scm.auditlog.AuditEntry;
|
2010-12-31 16:28:55 +01:00
|
|
|
import sonia.scm.group.Group;
|
2012-03-15 21:38:47 +01:00
|
|
|
import sonia.scm.xml.XmlDatabase;
|
2010-12-31 16:28:55 +01:00
|
|
|
|
Sorted autocomplete (#1918)
Users, groups, repositories and repository roles have been sorted in the rest layer by default if no other sort option was given. In the layers "below" (aka the manager classes or the dao), the collections have been unsorted. This led to the effect, that the autocomplete resource, which did not sort all values beforehand, returned unsorted results. As a sideeffect, direct matches for an input could occur at a random position or not at all (as reported in #1695), when there were enough other matches.
With this pull request the databases for users, groups, repositories and repository roles will use instances of TreeMap instead of LinkedHashMap internally, so that these values are sorted implicitly (by id respectively name for users, groups and repository roles and namespace/name for repositories).
Due to this change the default sort applied in the rest layer could be removed.
2022-01-18 09:46:10 +01:00
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.TreeMap;
|
2010-12-31 16:28:55 +01:00
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2023-03-21 12:03:51 +01:00
|
|
|
@AuditEntry(ignore = true)
|
2010-12-31 16:49:47 +01:00
|
|
|
@XmlRootElement(name = "group-db")
|
|
|
|
|
@XmlAccessorType(XmlAccessType.FIELD)
|
2012-03-15 21:38:47 +01:00
|
|
|
public class XmlGroupDatabase implements XmlDatabase<Group>
|
2010-12-31 16:28:55 +01:00
|
|
|
{
|
2024-02-06 14:54:00 +01:00
|
|
|
private Long creationTime;
|
|
|
|
|
|
|
|
|
|
@XmlJavaTypeAdapter(XmlGroupMapAdapter.class)
|
|
|
|
|
@XmlElement(name = "groups")
|
|
|
|
|
private Map<String, Group> groupMap = new TreeMap<>();
|
|
|
|
|
|
|
|
|
|
private Long lastModified;
|
2010-12-31 16:28:55 +01:00
|
|
|
|
2011-02-15 19:19:05 +01:00
|
|
|
public XmlGroupDatabase()
|
|
|
|
|
{
|
|
|
|
|
long c = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
creationTime = c;
|
|
|
|
|
lastModified = c;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public void add(Group group)
|
|
|
|
|
{
|
|
|
|
|
groupMap.put(group.getName(), group);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public boolean contains(String groupname)
|
|
|
|
|
{
|
|
|
|
|
return groupMap.containsKey(groupname);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public Group remove(String groupname)
|
|
|
|
|
{
|
|
|
|
|
return groupMap.remove(groupname);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public Collection<Group> values()
|
|
|
|
|
{
|
|
|
|
|
return groupMap.values();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public Group get(String groupname)
|
|
|
|
|
{
|
|
|
|
|
return groupMap.get(groupname);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public long getCreationTime()
|
|
|
|
|
{
|
|
|
|
|
return creationTime;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public long getLastModified()
|
|
|
|
|
{
|
|
|
|
|
return lastModified;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public void setCreationTime(long creationTime)
|
|
|
|
|
{
|
|
|
|
|
this.creationTime = creationTime;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-06 14:54:00 +01:00
|
|
|
|
2012-03-15 21:38:47 +01:00
|
|
|
@Override
|
2010-12-31 16:28:55 +01:00
|
|
|
public void setLastModified(long lastModified)
|
|
|
|
|
{
|
|
|
|
|
this.lastModified = lastModified;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|