Skip to content

Commit a259f07

Browse files
Merge 20.7.0 to develop
2 parents ff2f8f7 + f08774f commit a259f07

File tree

6 files changed

+260
-206
lines changed

6 files changed

+260
-206
lines changed

laboratory/src/org/labkey/laboratory/LaboratoryContainerListener.java

Lines changed: 90 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,6 @@ public void containerCreated(Container c, User user)
6868
{
6969
_log.warn("Unable to populate default values for laboratory module", e);
7070
}
71-
catch (BatchValidationException e)
72-
{
73-
//ignore, since this may just indicate the table already has these values
74-
}
7571
}
7672
}
7773

@@ -112,69 +108,11 @@ public void propertyChange(PropertyChangeEvent evt)
112108

113109
if (evt.getPropertyName().equals(ContainerManager.Property.Name.name()))
114110
{
115-
if (evt instanceof ContainerManager.ContainerPropertyChangeEvent)
116-
{
117-
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent) evt;
118-
if (ce.container.isWorkbook())
119-
{
120-
TableInfo ti = LaboratorySchema.getInstance().getTable(LaboratorySchema.TABLE_WORKBOOKS);
121-
TableSelector ts = new TableSelector(ti, new SimpleFilter(FieldKey.fromString(LaboratoryWorkbooksTable.WORKBOOK_COL), ce.container.getId()), null);
122-
if (ts.exists())
123-
{
124-
try
125-
{
126-
Integer rowId = Integer.parseInt(ce.container.getName());
127-
WorkbookModel w = ts.getObject(ce.container.getId(), WorkbookModel.class);
128-
w.setWorkbookId(rowId);
129-
Table.update(ce.user, ti, w, ce.container.getId());
130-
}
131-
catch (NumberFormatException e)
132-
{
133-
134-
}
135-
}
136-
}
137-
}
111+
updateWorkbookTableOnNameChange(evt);
138112
}
139-
else if (evt.getPropertyName().equals(ContainerManager.Property.Policy.name()))
113+
else if (evt.getPropertyName().equals(ContainerManager.Property.Modules.name()))
140114
{
141-
if (evt instanceof ContainerManager.ContainerPropertyChangeEvent)
142-
{
143-
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent)evt;
144-
145-
User u = ce.user;
146-
if (u == null && HttpView.hasCurrentView())
147-
u = HttpView.currentView().getViewContext().getUser();
148-
149-
if (u == null || !ce.container.hasPermission(u, InsertPermission.class))
150-
return;
151-
152-
if (ce.container.getActiveModules().contains(ModuleLoader.getInstance().getModule(LaboratoryModule.class)))
153-
{
154-
try
155-
{
156-
LaboratoryManager.get().initWorkbooksForContainer(u, ce.container);
157-
}
158-
catch (Exception e)
159-
{
160-
_log.error("Unable to update laboratory workbooks table", e);
161-
}
162-
163-
//attempt to populate default values on load
164-
try
165-
{
166-
LaboratoryManager.get().populateDefaultData(u, ce.container, null);
167-
}
168-
catch (IllegalArgumentException e)
169-
{
170-
_log.error("Unable to populate defaults in laboratory module tables", e);
171-
}
172-
catch (BatchValidationException e)
173-
{
174-
//ignore, since this may just indicate the table already has these values
175-
}
176-
}
177-
}
115+
possiblyInitializeOnActiveModuleChange(evt);
178116
}
179117
}
180118

@@ -194,4 +132,91 @@ protected void purgeTable(UserSchema userSchema, TableInfo table, Container c)
194132
super.purgeTable(userSchema, table, c);
195133
}
196134
}
135+
136+
/**
137+
* The container name field stores the workbookId as a string. If that name changes (and this should no longer be permitted
138+
* for the most part in LK, we need to update this table
139+
*/
140+
private void updateWorkbookTableOnNameChange(PropertyChangeEvent evt)
141+
{
142+
if (!(evt instanceof ContainerManager.ContainerPropertyChangeEvent))
143+
{
144+
return;
145+
}
146+
147+
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent) evt;
148+
if (!ce.container.isWorkbook())
149+
{
150+
return;
151+
}
152+
153+
TableInfo ti = LaboratorySchema.getInstance().getTable(LaboratorySchema.TABLE_WORKBOOKS);
154+
TableSelector ts = new TableSelector(ti, new SimpleFilter(FieldKey.fromString(LaboratoryWorkbooksTable.WORKBOOK_COL), ce.container.getId()), null);
155+
if (ts.exists())
156+
{
157+
try
158+
{
159+
Integer workbookId = Integer.parseInt(ce.container.getName());
160+
WorkbookModel w = ts.getObject(ce.container.getId(), WorkbookModel.class);
161+
w.setWorkbookId(workbookId);
162+
Table.update(ce.user, ti, w, ce.container.getId());
163+
}
164+
catch (NumberFormatException e)
165+
{
166+
_log.error("Non-numeric workbook name: " + ce.container.getName() + " for: " + ce.container.getEntityId());
167+
}
168+
}
169+
}
170+
171+
/**
172+
* The intent of this is to initialize the laboratory folder if the set of active modules
173+
* changes to include Laboratory. This should only occur on the parent folder, not individual workbooks.
174+
*/
175+
private void possiblyInitializeOnActiveModuleChange(PropertyChangeEvent evt)
176+
{
177+
if (!(evt instanceof ContainerManager.ContainerPropertyChangeEvent))
178+
{
179+
return;
180+
}
181+
182+
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent)evt;
183+
184+
//Only make these changes from the parent container for performance reasons
185+
if (ce.container.isWorkbook())
186+
{
187+
return;
188+
}
189+
190+
User u = ce.user;
191+
if (u == null && HttpView.hasCurrentView())
192+
{
193+
u = HttpView.currentView().getViewContext().getUser();
194+
}
195+
196+
if (u == null || !ce.container.hasPermission(u, InsertPermission.class))
197+
{
198+
return;
199+
}
200+
201+
if (ce.container.getActiveModules().contains(ModuleLoader.getInstance().getModule(LaboratoryModule.class)))
202+
{
203+
try
204+
{
205+
LaboratoryManager.get().recursivelyInitWorkbooksForContainer(u, ce.container);
206+
}
207+
catch (Exception e)
208+
{
209+
_log.error("Unable to update laboratory workbooks table", e);
210+
}
211+
212+
try
213+
{
214+
LaboratoryManager.get().populateDefaultData(u, ce.container, null);
215+
}
216+
catch (Exception e)
217+
{
218+
_log.error("Unable to populate defaults in laboratory module tables", e);
219+
}
220+
}
221+
}
197222
}

laboratory/src/org/labkey/laboratory/LaboratoryController.java

Lines changed: 4 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ public boolean handlePost(Object form, BindException errors) throws Exception
471471
{
472472
try
473473
{
474-
LaboratoryManager.get().initWorkbooksForContainer(getUser(), getContainer());
474+
LaboratoryManager.get().recursivelyInitWorkbooksForContainer(getUser(), getContainer());
475475

476476
return true;
477477
}
@@ -747,7 +747,7 @@ public ApiResponse execute(UpdateWorkbookForm form, BindException errors) throws
747747
return null;
748748
}
749749

750-
WorkbookModel model = LaboratoryManager.get().getWorkbookModel(getContainer());
750+
WorkbookModel model = LaboratoryManager.get().getWorkbookModel(getContainer(), true);
751751
if (model == null)
752752
{
753753
errors.reject(ERROR_MSG, "Unable to find workbook record for this folder");
@@ -759,11 +759,11 @@ public ApiResponse execute(UpdateWorkbookForm form, BindException errors) throws
759759
model.setResults(form.getResults());
760760
model.setDescription(form.getDescription(), getUser());
761761

762-
LaboratoryManager.get().updateWorkbook(getUser(), model);
762+
LaboratoryManager.get().createOrUpdateWorkbook(getUser(), model);
763763

764764
if (form.isForceTagUpdate() || form.getTags() != null)
765765
{
766-
LaboratoryManager.get().updateWorkbookTags(getUser(), getContainer(), (form.getTags() == null ? (Collection)Collections.emptyList() : Arrays.asList(form.getTags())));
766+
LaboratoryManager.get().updateWorkbookTags(getUser(), getContainer(), (form.getTags() == null ? Collections.emptyList() : Arrays.asList(form.getTags())));
767767
}
768768

769769
results.put("success", true);
@@ -2295,74 +2295,6 @@ public void setProtocol(Integer protocol)
22952295
}
22962296
}
22972297

2298-
@RequiresPermission(AdminPermission.class)
2299-
public class MigrateWorkbooksAction extends MutatingApiAction<MigrateWorkbooksForm>
2300-
{
2301-
@Override
2302-
public ApiResponse execute(MigrateWorkbooksForm form, BindException errors) throws Exception
2303-
{
2304-
if (getContainer().isWorkbook())
2305-
{
2306-
errors.reject(ERROR_MSG, "Cannot be run on workbooks");
2307-
return null;
2308-
}
2309-
2310-
//find current workbook #
2311-
2312-
2313-
//find all workbooks where workbookId doesnt match LK ID
2314-
TreeMap<Integer, Container> toFix = new TreeMap<>();
2315-
for (Container c : ContainerManager.getChildren(getContainer()))
2316-
{
2317-
if (c.isWorkbook())
2318-
{
2319-
WorkbookModel w = LaboratoryManager.get().getWorkbookModel(c);
2320-
if (w != null)
2321-
{
2322-
_log.warn("workbook model not found for: " + c.getName());
2323-
}
2324-
else if (!c.getName().equals(w.getWorkbookId().toString()))
2325-
{
2326-
toFix.put(w.getWorkbookId(), c);
2327-
}
2328-
}
2329-
}
2330-
2331-
_log.info("workbooks to migrate: " + toFix.size());
2332-
Set<Integer> list = form.getReverseOrder() == true ? toFix.keySet() : toFix.descendingKeySet();
2333-
for (Integer id : list)
2334-
{
2335-
Container wb = toFix.get(id);
2336-
Container target = ContainerManager.getChild(wb.getParent(), id.toString());
2337-
if (target != null)
2338-
{
2339-
_log.warn("target workbook exists, skipping: " + id);
2340-
}
2341-
else
2342-
{
2343-
ContainerManager.rename(wb, getUser(), id.toString());
2344-
}
2345-
}
2346-
2347-
return new ApiSimpleResponse("success", true);
2348-
}
2349-
}
2350-
2351-
public static class MigrateWorkbooksForm
2352-
{
2353-
private Boolean reverseOrder = false;
2354-
2355-
public Boolean getReverseOrder()
2356-
{
2357-
return reverseOrder;
2358-
}
2359-
2360-
public void setReverseOrder(Boolean reverseOrder)
2361-
{
2362-
this.reverseOrder = reverseOrder;
2363-
}
2364-
}
2365-
23662298
@RequiresPermission(ReadPermission.class)
23672299
public class DataBrowserAction extends SimpleViewAction<Object>
23682300
{

0 commit comments

Comments
 (0)