Skip to content

Commit 7bd2939

Browse files
committed
Merge remote-tracking branch 'origin/develop' into fb_exportMetricsFromAudit
2 parents a335d80 + dafb688 commit 7bd2939

73 files changed

Lines changed: 6512 additions & 4968 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,8 +1132,8 @@ dependencies {
11321132
BuildUtils.addExternalDependency(
11331133
project,
11341134
new ExternalDependency(
1135-
"org.springframework.ai:spring-ai-advisors-vector-store:${springAiVersion}",
1136-
"spring-ai-advisors-vector-store",
1135+
"org.springframework.ai:spring-ai-vector-store:${springAiVersion}",
1136+
"spring-ai-vector-store",
11371137
"spring-ai",
11381138
"https://github.com/spring-projects/spring-ai",
11391139
ExternalDependency.APACHE_2_LICENSE_NAME,

api/src/org/labkey/api/data/CompareType.java

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -560,44 +560,6 @@ public boolean isNewLineSeparatorAllowed()
560560
}
561561
};
562562

563-
public static final CompareType IN_NS = new CompareType("Equals One Of A Member Of A Named Set", "inns", "IN", true, null, OperatorType.IN)
564-
{
565-
// Each compare type uses CompareClause by default
566-
@Override
567-
public FilterClause createFilterClause(@NotNull FieldKey fieldKey, Object value)
568-
{
569-
String namedSet = null;
570-
if (value != null && StringUtils.isNotBlank(value.toString()))
571-
namedSet = value.toString();
572-
return new SimpleFilter.InClause(fieldKey, namedSet, true);
573-
}
574-
575-
@Override
576-
public boolean meetsCriteria(ColumnRenderProperties col, Object value, Object[] paramVals)
577-
{
578-
throw new UnsupportedOperationException("Should be handled inside of " + SimpleFilter.InClause.class);
579-
}
580-
};
581-
582-
public static final CompareType NOT_IN_NS = new CompareType("Does Not Equal Any Members Of A Named Set", "notinns", "NOT IN", true, null, OperatorType.NOTIN)
583-
{
584-
// Each compare type uses CompareClause by default
585-
@Override
586-
public FilterClause createFilterClause(@NotNull FieldKey fieldKey, Object value)
587-
{
588-
String namedSet = null;
589-
if (value != null && StringUtils.isNotBlank(value.toString()))
590-
namedSet = value.toString();
591-
return new SimpleFilter.InClause(fieldKey, namedSet, true);
592-
}
593-
594-
@Override
595-
public boolean meetsCriteria(ColumnRenderProperties col, Object value, Object[] paramVals)
596-
{
597-
throw new UnsupportedOperationException("Should be handled inside of " + SimpleFilter.InClause.class);
598-
}
599-
};
600-
601563
// BETWEEN is inclusive of the begin and end values
602564
public static final CompareType BETWEEN = new CompareType("Between", "between", "BETWEEN", true, " BETWEEN ? AND ?", OperatorType.BETWEEN)
603565
{

api/src/org/labkey/api/data/NestedRenderContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public SimpleFilter buildFilter(TableInfo tinfo, List<ColumnInfo> displayColumns
131131
fullSQL.append(" ) Limited )");
132132

133133
// Apply a filter that restricts the group ids to the right "page" of data
134-
result.addClause(new SimpleFilter.SQLClause(fullSQL.getSQL(), fullSQL.getParamsArray()));
134+
result.addClause(new SimpleFilter.SQLClause(fullSQL));
135135
}
136136
return result;
137137
}

api/src/org/labkey/api/data/SimpleFilter.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -719,11 +719,6 @@ public InClause(FieldKey fieldKey, Collection<?> params, boolean urlClause, bool
719719
_needsTypeConversion = urlClause;
720720
}
721721

722-
public InClause(FieldKey fieldKey, String namedSet, boolean urlClause)
723-
{
724-
this(fieldKey, QueryService.get().getNamedSet(namedSet), urlClause, false);
725-
}
726-
727722
@Override
728723
public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter)
729724
{

api/src/org/labkey/api/mcp/McpService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ default User getUser(ToolContext toolContext)
118118
default void incrementResourceRequestCount(String resource)
119119
{
120120
if (!get().isEnabled())
121-
throw new RuntimeException("The MCP server is not enabled for external requests. Consider toggling the experimental feature flag.");
121+
throw new RuntimeException("The MCP server is not enabled for external requests. Consider toggling the optional feature flag.");
122122

123123
get().incrementResourceRequestCount(resource);
124124
}

api/src/org/labkey/api/module/Module.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.jetbrains.annotations.NotNull;
2525
import org.jetbrains.annotations.Nullable;
2626
import org.json.JSONObject;
27+
import org.labkey.api.Constants;
2728
import org.labkey.api.data.Container;
2829
import org.labkey.api.data.DbSchema;
2930
import org.labkey.api.data.DbScope;
@@ -444,4 +445,10 @@ default String getBuildTime()
444445
default void registerMigrationHandlers(@NotNull DatabaseMigrationService service)
445446
{
446447
}
448+
449+
// Override in cases such as a module transitioning from unmanaged to managed
450+
default double getEarliestUpgradeVersion()
451+
{
452+
return Constants.getEarliestUpgradeVersion();
453+
}
447454
}

api/src/org/labkey/api/module/ModuleLoader.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -633,13 +633,21 @@ private void doInit(Execution execution) throws ServletException
633633
.filter(ctx -> ctx.getSchemaVersion() != null)
634634
.collect(Collectors.toMap(ModuleContext::getName, ctx->ctx));
635635

636+
record ModuleAndModuleContext(Module module, ModuleContext context)
637+
{
638+
boolean isTooOld()
639+
{
640+
return context.getInstalledVersion() < module.getEarliestUpgradeVersion();
641+
}
642+
}
643+
636644
// List of "<name> (<installedSchemaVersion>)" of LabKey-managed modules with schemas where the installed
637-
// version is less than "earliest upgrade version"
645+
// version is less than the module's earliest upgrade version
638646
var tooOld = labkeyModules.stream()
639-
.map(m -> moduleContextMap.get(m.getName()))
640-
.filter(Objects::nonNull)
641-
.filter(ctx -> ctx.getInstalledVersion() < Constants.getEarliestUpgradeVersion())
642-
.map(UpgradeInfo::new)
647+
.map(m -> new ModuleAndModuleContext(m, moduleContextMap.get(m.getName())))
648+
.filter(mmc -> mmc.context() != null)
649+
.filter(ModuleAndModuleContext::isTooOld)
650+
.map(mmc -> new UpgradeInfo(mmc.context()))
643651
.toList();
644652

645653
if (!tooOld.isEmpty())
@@ -655,7 +663,7 @@ private void doInit(Execution execution) throws ServletException
655663

656664
// Now that we know if this is a new install...
657665
setDatabaseMigrationConfiguration(labkeyRoot);
658-
boolean coreRequiredUpgrade = upgradeCoreModule(lockFile);
666+
upgradeCoreModule(lockFile);
659667

660668
// Issue 40422 - log server and session GUIDs during startup. Do it after the core module has
661669
// been bootstrapped/upgraded to ensure that AppProps is ready

api/src/org/labkey/api/query/InvalidNamedSetException.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

api/src/org/labkey/api/query/QueryService.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.labkey.api.data.Sort;
4343
import org.labkey.api.data.SqlSelector;
4444
import org.labkey.api.data.TableInfo;
45-
import org.labkey.api.data.TableSelector;
4645
import org.labkey.api.data.dialect.SqlDialect;
4746
import org.labkey.api.gwt.client.model.GWTPropertyDescriptor;
4847
import org.labkey.api.module.Module;
@@ -62,7 +61,6 @@
6261
import org.springframework.web.servlet.mvc.Controller;
6362

6463
import java.io.IOException;
65-
import java.sql.ResultSet;
6664
import java.util.Collection;
6765
import java.util.LinkedHashMap;
6866
import java.util.List;
@@ -504,10 +502,6 @@ interface Hierarchy
504502
*/
505503
Collection<Hierarchy> getOlapHierarchies(String configId, Container c, String cubeName, String dimension);
506504

507-
void saveNamedSet(String setName, List<String> setList);
508-
void deleteNamedSet(String setName);
509-
List<String> getNamedSet(String setName);
510-
511505
/**
512506
* Add a pass-through method to the allow list for the primary LabKey database type. This enables modules to create
513507
* and enable custom database functions, for example.

api/src/org/labkey/api/security/SecurityManager.java

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import org.labkey.api.data.PropertyManager.WritablePropertyMap;
5656
import org.labkey.api.data.RuntimeSQLException;
5757
import org.labkey.api.data.SQLFragment;
58-
import org.labkey.api.data.Selector;
5958
import org.labkey.api.data.SimpleFilter;
6059
import org.labkey.api.data.SqlExecutor;
6160
import org.labkey.api.data.SqlSelector;
@@ -1883,126 +1882,6 @@ public static String getMembershipPathwayHTMLDisplay(Set<List<UserPrincipal>> pa
18831882
sb.append("<BR/>");
18841883
}
18851884
return sb.toString();
1886-
}
1887-
1888-
// TODO: Redundant with getProjectUsers() -- this approach should be more efficient for simple cases
1889-
// TODO: Also redundant with getFolderUserids()
1890-
// TODO: Cache this set
1891-
public static Set<Integer> getProjectUsersIds(Container c)
1892-
{
1893-
SQLFragment sql = getProjectUsersSQL(c.getProject());
1894-
sql.insert(0, "SELECT DISTINCT members.UserId ");
1895-
1896-
Selector selector = new SqlSelector(core.getSchema(), sql);
1897-
return new HashSet<>(selector.getCollection(Integer.class));
1898-
}
1899-
1900-
// True fragment -- need to prepend SELECT DISTINCT() or IN () for this to be valid SQL
1901-
public static SQLFragment getProjectUsersSQL(Container c)
1902-
{
1903-
return new SQLFragment("FROM " + core.getTableInfoMembers() + " members INNER JOIN " + core.getTableInfoUsers() + " users ON members.UserId = users.UserId\n" +
1904-
"INNER JOIN " + core.getTableInfoPrincipals() + " groups ON members.GroupId = groups.UserId\n" +
1905-
"WHERE (groups.Container = ?)", c);
1906-
}
1907-
1908-
public static @NotNull List<User> getProjectUsers(Container c)
1909-
{
1910-
return getProjectUsers(c, false, true);
1911-
}
1912-
1913-
public static @NotNull List<User> getProjectUsers(Container c, boolean includeGlobal, boolean includeInactive)
1914-
{
1915-
if (c != null && !c.isProject())
1916-
c = c.getProject();
1917-
1918-
List<Group> groups = getGroups(c, includeGlobal);
1919-
Set<String> emails = new HashSet<>();
1920-
1921-
//get members for each group
1922-
ArrayList<User> projectUsers = new ArrayList<>();
1923-
Set<User> members;
1924-
1925-
for (Group g : groups)
1926-
{
1927-
if (g.isGuests() || g.isUsers())
1928-
continue;
1929-
1930-
// TODO: currently only getting members that are users (no groups). should this be changed to get users of member groups?
1931-
members = getGroupMembers(g, includeInactive ? MemberType.ACTIVE_AND_INACTIVE_USERS : MemberType.ACTIVE_USERS);
1932-
1933-
//add this group's members to hashset
1934-
if (!members.isEmpty())
1935-
{
1936-
//get list of users from email
1937-
for (UserPrincipal member : members)
1938-
{
1939-
User user = UserManager.getUser(member.getUserId());
1940-
if (null != user && emails.add(user.getEmail()))
1941-
projectUsers.add(user);
1942-
}
1943-
}
1944-
}
1945-
1946-
return projectUsers;
1947-
}
1948-
1949-
public static Collection<Integer> getFolderUserids(Container c)
1950-
{
1951-
Container project = (c.isProject() || c.isRoot()) ? c : c.getProject();
1952-
SecurityPolicy policy = c.getPolicy();
1953-
1954-
//don't filter if all site users is playing a role
1955-
Group allSiteUsers = getGroup(Group.groupUsers);
1956-
if (policy.getAssignedRoles(allSiteUsers).findAny().isPresent())
1957-
{
1958-
// Just select all users
1959-
SQLFragment sql = new SQLFragment("SELECT u.UserId FROM ");
1960-
sql.append(core.getTableInfoPrincipals(), "u");
1961-
sql.append(" WHERE u.type='u'");
1962-
1963-
return new SqlSelector(core.getSchema(), sql).getCollection(Integer.class);
1964-
}
1965-
1966-
//users "in the project" consists of:
1967-
// - users who are members of a project group
1968-
// - users who belong to a site group that has a role assignment in the policy for the specified folder
1969-
// - users who have a direct role assignment in the policy for the specified folder
1970-
1971-
Set<Integer> userIds = new HashSet<>();
1972-
1973-
// Add all project groups
1974-
Set<Group> groupsToExpand = new HashSet<>(getGroups(project, false));
1975-
1976-
// Look for users and site groups that have direct assignment to the container
1977-
for (RoleAssignment roleAssignment : c.getPolicy().getAssignments())
1978-
{
1979-
User user = UserManager.getUser(roleAssignment.getUserId());
1980-
if (user != null)
1981-
{
1982-
userIds.add(user.getUserId());
1983-
}
1984-
else
1985-
{
1986-
Group assignedGroup = getGroup(roleAssignment.getUserId());
1987-
if (assignedGroup != null && !assignedGroup.isProjectGroup())
1988-
{
1989-
// Add all site groups
1990-
groupsToExpand.add(assignedGroup);
1991-
}
1992-
}
1993-
}
1994-
1995-
// Find the users who are members of all the relevant site groups
1996-
for (Group group : groupsToExpand)
1997-
{
1998-
Set<User> groupMembers = getAllGroupMembers(group, MemberType.ACTIVE_AND_INACTIVE_USERS);
1999-
for (User groupMember : groupMembers)
2000-
{
2001-
userIds.add(groupMember.getUserId());
2002-
}
2003-
}
2004-
2005-
return userIds;
20061885
}
20071886

20081887
/**

0 commit comments

Comments
 (0)