Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 90 additions & 65 deletions laboratory/src/org/labkey/laboratory/LaboratoryContainerListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@ public void containerCreated(Container c, User user)
{
_log.warn("Unable to populate default values for laboratory module", e);
}
catch (BatchValidationException e)
{
//ignore, since this may just indicate the table already has these values
}
}
}

Expand Down Expand Up @@ -112,69 +108,11 @@ public void propertyChange(PropertyChangeEvent evt)

if (evt.getPropertyName().equals(ContainerManager.Property.Name.name()))
{
if (evt instanceof ContainerManager.ContainerPropertyChangeEvent)
{
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent) evt;
if (ce.container.isWorkbook())
{
TableInfo ti = LaboratorySchema.getInstance().getTable(LaboratorySchema.TABLE_WORKBOOKS);
TableSelector ts = new TableSelector(ti, new SimpleFilter(FieldKey.fromString(LaboratoryWorkbooksTable.WORKBOOK_COL), ce.container.getId()), null);
if (ts.exists())
{
try
{
Integer rowId = Integer.parseInt(ce.container.getName());
WorkbookModel w = ts.getObject(ce.container.getId(), WorkbookModel.class);
w.setWorkbookId(rowId);
Table.update(ce.user, ti, w, ce.container.getId());
}
catch (NumberFormatException e)
{

}
}
}
}
updateWorkbookTableOnNameChange(evt);
}
else if (evt.getPropertyName().equals(ContainerManager.Property.Policy.name()))
else if (evt.getPropertyName().equals(ContainerManager.Property.Modules.name()))
{
if (evt instanceof ContainerManager.ContainerPropertyChangeEvent)
{
ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent)evt;

User u = ce.user;
if (u == null && HttpView.hasCurrentView())
u = HttpView.currentView().getViewContext().getUser();

if (u == null || !ce.container.hasPermission(u, InsertPermission.class))
return;

if (ce.container.getActiveModules().contains(ModuleLoader.getInstance().getModule(LaboratoryModule.class)))
{
try
{
LaboratoryManager.get().initWorkbooksForContainer(u, ce.container);
}
catch (Exception e)
{
_log.error("Unable to update laboratory workbooks table", e);
}

//attempt to populate default values on load
try
{
LaboratoryManager.get().populateDefaultData(u, ce.container, null);
}
catch (IllegalArgumentException e)
{
_log.error("Unable to populate defaults in laboratory module tables", e);
}
catch (BatchValidationException e)
{
//ignore, since this may just indicate the table already has these values
}
}
}
possiblyInitializeOnActiveModuleChange(evt);
}
}

Expand All @@ -194,4 +132,91 @@ protected void purgeTable(UserSchema userSchema, TableInfo table, Container c)
super.purgeTable(userSchema, table, c);
}
}

/**
* The container name field stores the workbookId as a string. If that name changes (and this should no longer be permitted
* for the most part in LK, we need to update this table
*/
private void updateWorkbookTableOnNameChange(PropertyChangeEvent evt)
{
if (!(evt instanceof ContainerManager.ContainerPropertyChangeEvent))
{
return;
}

ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent) evt;
if (!ce.container.isWorkbook())
{
return;
}

TableInfo ti = LaboratorySchema.getInstance().getTable(LaboratorySchema.TABLE_WORKBOOKS);
TableSelector ts = new TableSelector(ti, new SimpleFilter(FieldKey.fromString(LaboratoryWorkbooksTable.WORKBOOK_COL), ce.container.getId()), null);
if (ts.exists())
{
try
{
Integer workbookId = Integer.parseInt(ce.container.getName());
WorkbookModel w = ts.getObject(ce.container.getId(), WorkbookModel.class);
w.setWorkbookId(workbookId);
Table.update(ce.user, ti, w, ce.container.getId());
}
catch (NumberFormatException e)
{
_log.error("Non-numeric workbook name: " + ce.container.getName() + " for: " + ce.container.getEntityId());
}
}
}

/**
* The intent of this is to initialize the laboratory folder if the set of active modules
* changes to include Laboratory. This should only occur on the parent folder, not individual workbooks.
*/
private void possiblyInitializeOnActiveModuleChange(PropertyChangeEvent evt)
{
if (!(evt instanceof ContainerManager.ContainerPropertyChangeEvent))
{
return;
}

ContainerManager.ContainerPropertyChangeEvent ce = (ContainerManager.ContainerPropertyChangeEvent)evt;

//Only make these changes from the parent container for performance reasons
if (ce.container.isWorkbook())
{
return;
}

User u = ce.user;
if (u == null && HttpView.hasCurrentView())
{
u = HttpView.currentView().getViewContext().getUser();
}

if (u == null || !ce.container.hasPermission(u, InsertPermission.class))
{
return;
}

if (ce.container.getActiveModules().contains(ModuleLoader.getInstance().getModule(LaboratoryModule.class)))
{
try
{
LaboratoryManager.get().recursivelyInitWorkbooksForContainer(u, ce.container);
}
catch (Exception e)
{
_log.error("Unable to update laboratory workbooks table", e);
}

try
{
LaboratoryManager.get().populateDefaultData(u, ce.container, null);
}
catch (Exception e)
{
_log.error("Unable to populate defaults in laboratory module tables", e);
}
}
}
}
76 changes: 4 additions & 72 deletions laboratory/src/org/labkey/laboratory/LaboratoryController.java
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ public boolean handlePost(Object form, BindException errors) throws Exception
{
try
{
LaboratoryManager.get().initWorkbooksForContainer(getUser(), getContainer());
LaboratoryManager.get().recursivelyInitWorkbooksForContainer(getUser(), getContainer());

return true;
}
Expand Down Expand Up @@ -747,7 +747,7 @@ public ApiResponse execute(UpdateWorkbookForm form, BindException errors) throws
return null;
}

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

LaboratoryManager.get().updateWorkbook(getUser(), model);
LaboratoryManager.get().createOrUpdateWorkbook(getUser(), model);

if (form.isForceTagUpdate() || form.getTags() != null)
{
LaboratoryManager.get().updateWorkbookTags(getUser(), getContainer(), (form.getTags() == null ? (Collection)Collections.emptyList() : Arrays.asList(form.getTags())));
LaboratoryManager.get().updateWorkbookTags(getUser(), getContainer(), (form.getTags() == null ? Collections.emptyList() : Arrays.asList(form.getTags())));
}

results.put("success", true);
Expand Down Expand Up @@ -2295,74 +2295,6 @@ public void setProtocol(Integer protocol)
}
}

@RequiresPermission(AdminPermission.class)
public class MigrateWorkbooksAction extends MutatingApiAction<MigrateWorkbooksForm>
{
@Override
public ApiResponse execute(MigrateWorkbooksForm form, BindException errors) throws Exception
{
if (getContainer().isWorkbook())
{
errors.reject(ERROR_MSG, "Cannot be run on workbooks");
return null;
}

//find current workbook #


//find all workbooks where workbookId doesnt match LK ID
TreeMap<Integer, Container> toFix = new TreeMap<>();
for (Container c : ContainerManager.getChildren(getContainer()))
{
if (c.isWorkbook())
{
WorkbookModel w = LaboratoryManager.get().getWorkbookModel(c);
if (w != null)
{
_log.warn("workbook model not found for: " + c.getName());
}
else if (!c.getName().equals(w.getWorkbookId().toString()))
{
toFix.put(w.getWorkbookId(), c);
}
}
}

_log.info("workbooks to migrate: " + toFix.size());
Set<Integer> list = form.getReverseOrder() == true ? toFix.keySet() : toFix.descendingKeySet();
for (Integer id : list)
{
Container wb = toFix.get(id);
Container target = ContainerManager.getChild(wb.getParent(), id.toString());
if (target != null)
{
_log.warn("target workbook exists, skipping: " + id);
}
else
{
ContainerManager.rename(wb, getUser(), id.toString());
}
}

return new ApiSimpleResponse("success", true);
}
}

public static class MigrateWorkbooksForm
{
private Boolean reverseOrder = false;

public Boolean getReverseOrder()
{
return reverseOrder;
}

public void setReverseOrder(Boolean reverseOrder)
{
this.reverseOrder = reverseOrder;
}
}

@RequiresPermission(ReadPermission.class)
public class DataBrowserAction extends SimpleViewAction<Object>
{
Expand Down
Loading