package edu.harvard.med.screensaver.ui.cherrypickrequests; import static edu.harvard.med.screensaver.ui.cherrypickrequests.CherryPickRequestViewer.RNAI_COLUMNS_GROUP; import static edu.harvard.med.screensaver.ui.cherrypickrequests.CherryPickRequestViewer.SMALL_MOLECULE_COLUMNS_GROUP; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import edu.harvard.med.screensaver.db.EntityInflator; import edu.harvard.med.screensaver.db.GenericEntityDAO; import edu.harvard.med.screensaver.db.NoSuchEntityException; import edu.harvard.med.screensaver.db.datafetcher.DataFetcherUtil; import edu.harvard.med.screensaver.db.datafetcher.EntityDataFetcher; import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder; import edu.harvard.med.screensaver.model.cherrypicks.CherryPickAssayPlate; import edu.harvard.med.screensaver.model.cherrypicks.CherryPickRequest; import edu.harvard.med.screensaver.model.cherrypicks.LabCherryPick; import edu.harvard.med.screensaver.model.cherrypicks.LabCherryPick.LabCherryPickStatus; import edu.harvard.med.screensaver.model.cherrypicks.ScreenerCherryPick; import edu.harvard.med.screensaver.model.libraries.Copy; import edu.harvard.med.screensaver.model.libraries.Gene; import edu.harvard.med.screensaver.model.libraries.Reagent; import edu.harvard.med.screensaver.model.libraries.SilencingReagent; import edu.harvard.med.screensaver.model.libraries.Well; import edu.harvard.med.screensaver.model.libraries.WellCopy; import edu.harvard.med.screensaver.model.libraries.WellVolumeAdjustment; import edu.harvard.med.screensaver.model.meta.RelationshipPath; import edu.harvard.med.screensaver.model.screens.ScreenType; import edu.harvard.med.screensaver.model.users.AdministratorUser; import edu.harvard.med.screensaver.model.users.ScreensaverUserRole; import edu.harvard.med.screensaver.service.cherrypicks.CherryPickRequestAllocator; import edu.harvard.med.screensaver.service.libraries.WellCopyVolumeAdjuster; import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.BooleanEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.EnumEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.HasFetchPaths; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.IntegerEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.IntegerSetEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextSetEntityColumn; import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryEntityDataModel; import edu.harvard.med.screensaver.ui.arch.searchresults.EntityBasedEntitySearchResults; import edu.harvard.med.screensaver.util.NullSafeUtils; public class LabCherryPicksSearchResult extends EntityBasedEntitySearchResults<LabCherryPick,Integer> { private CherryPickRequest _cherryPickRequest; private CherryPickRequestAllocator _cherryPickRequestAllocator; private WellCopyVolumeAdjuster _wellCopyVolumeAdjuster; private GenericEntityDAO _dao; private String _labCherryPickSourceCopyUpdateComments; private boolean _isRecordOriginalSourceCopyWellsAsEmpty; protected LabCherryPicksSearchResult() {} protected static final Predicate<String> NOT_EMPTY = Predicates.and(Predicates.notNull(), Predicates.not(Predicates.equalTo(""))); public LabCherryPicksSearchResult(CherryPickRequestAllocator cherryPickRequestAllocator, WellCopyVolumeAdjuster wellCopyVolumeAdjuster, GenericEntityDAO dao) { _cherryPickRequestAllocator = cherryPickRequestAllocator; _wellCopyVolumeAdjuster = wellCopyVolumeAdjuster; _dao = dao; } @Override public void searchAll() { _cherryPickRequest = null; initialize(); } public void searchForCherryPickRequest(CherryPickRequest cpr) { _cherryPickRequest = cpr; if (cpr == null) { initialize(); } else { initialize(new InMemoryEntityDataModel<LabCherryPick,Integer,LabCherryPick>(new EntityDataFetcher<LabCherryPick,Integer>(LabCherryPick.class, _dao) { @Override public void addDomainRestrictions(HqlBuilder hql) { DataFetcherUtil.addDomainRestrictions(hql, RelationshipPath.from(LabCherryPick.class).to("cherryPickRequest"), _cherryPickRequest, getRootAlias()); } })); getColumnManager().setVisibilityOfColumnsInGroup(RNAI_COLUMNS_GROUP, false /* * cpr.getScreen().getScreenType() == * ScreenType.RNAI */); getColumnManager().setVisibilityOfColumnsInGroup(SMALL_MOLECULE_COLUMNS_GROUP, false /* * cpr.getScreen().getScreenType * () == * ScreenType.SMALL_MOLECULE */); } setEditingRole(ScreensaverUserRole.CHERRY_PICK_REQUESTS_ADMIN); } @Override public List<? extends TableColumn<LabCherryPick,?>> buildColumns() { List<TableColumn<LabCherryPick,?>> labCherryPicksTableColumns = buildLabCherryPicksTableColumns(); // note: eager fetching relationships, since Hibernate otherwise loads them individually, and slowly (these RelationshipPaths are arbitrarily added to the first column) ((HasFetchPaths<LabCherryPick>) labCherryPicksTableColumns.get(0)).addRelationshipPath(LabCherryPick.sourceWell.to(Well.latestReleasedReagent)); ((HasFetchPaths<LabCherryPick>) labCherryPicksTableColumns.get(0)).addRelationshipPath(LabCherryPick.screenerCherryPick.to(ScreenerCherryPick.screenedWell).to(Well.latestReleasedReagent)); getColumnManager().addAllCompoundSorts(buildLabCherryPicksTableCompoundSorts(labCherryPicksTableColumns)); return labCherryPicksTableColumns; } protected List<TableColumn<LabCherryPick,?>> buildLabCherryPicksTableColumns() { List<TableColumn<LabCherryPick,?>> labCherryPicksTableColumns = Lists.newArrayList(); labCherryPicksTableColumns.add(new EnumEntityColumn<LabCherryPick,LabCherryPickStatus>( LabCherryPick.wellVolumeAdjustments, "Status", "Status", TableColumn.UNGROUPED, LabCherryPickStatus.values()) { @Override public LabCherryPickStatus getCellValue(LabCherryPick lcp) { return lcp.getStatus(); } }); ((HasFetchPaths<LabCherryPick>) labCherryPicksTableColumns.get(0)).addRelationshipPath(LabCherryPick.assayPlate.to(CherryPickAssayPlate.cherryPickLiquidTransfer)); labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>( LabCherryPick.sourceWell.to(Well.library).toProperty("shortName"), "Library Name", "The library name of the cherry picked well", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { return lcp.getSourceWell().getLibrary().getShortName(); } }); labCherryPicksTableColumns.add(new IntegerEntityColumn<LabCherryPick>( LabCherryPick.sourceWell.toProperty("plateNumber"), "Library Plate", "The library plate number of the cherry picked well", TableColumn.UNGROUPED) { @Override public Integer getCellValue(LabCherryPick lcp) { return lcp.getSourceWell().getPlateNumber(); } }); labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>( LabCherryPick.sourceWell.toProperty("wellName"), "Source Well", "The name of the cherry picked well", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { return lcp.getSourceWell().getWellName(); } }); labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>( LabCherryPick.wellVolumeAdjustments.to(WellVolumeAdjustment.copy), "Source Copy", "The library plate copy of the cherry picked well", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { return lcp.getSourceCopy() != null ? lcp.getSourceCopy().getName() : ""; } @Override public void setCellValue(LabCherryPick lcp, String newCopyName) { lcpNewSourceCopies.put(lcp, newCopyName); } @Override public boolean isEditable() { return getScreensaverUser().isUserInRole(ScreensaverUserRole.CHERRY_PICK_REQUESTS_ADMIN); } }); // labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>( // LabCherryPick.wellVolumeAdjustments.to(WellVolumeAdjustment.copy).to(Copy.plates), // "Plate Freezer Location", // "The freezer in which the plate is stored", // TableColumn.UNGROUPED) { // @Override // public String getCellValue(LabCherryPick lcp) // { // if (lcp.isAllocated()) { // return lcp.getSourceCopy().getPlates().get(lcp.getSourceWell().getPlateNumber()).getLocation().getFreezer(); // } // return null; // } // }); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<Reagent,String>( Reagent.class, new TextEntityColumn<Reagent>( Reagent.vendorName, "Vendor Name", "The vendor of the reagent in this well", TableColumn.UNGROUPED) { @Override public String getCellValue(Reagent r) { return r.getVendorId().getVendorName(); } })); //Iterables.getLast(labCherryPicksTableColumns).setVisible(false); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<Reagent,String>( Reagent.class, new TextEntityColumn<Reagent>( Reagent.vendorIdentifier, "Reagent ID", "The vendor-assigned identifier for the reagent in this well", TableColumn.UNGROUPED) { @Override public String getCellValue(Reagent r) { return r.getVendorId().getVendorIdentifier(); } })); //Iterables.getLast(labCherryPicksTableColumns).setVisible(false); if (_cherryPickRequest.getScreen().getScreenType() == ScreenType.RNAI) { labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>(LabCherryPick.screenerCherryPick.to(ScreenerCherryPick.screenedWell).to(Well.latestReleasedReagent), "Pool Reagent Vendor ID", "The vendor-assigned identifier of the associated pool for the duplex reagent in this well", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { Well screenedWell = lcp.getScreenerCherryPick().getScreenedWell(); if (screenedWell.getLibrary().isPool()) { Reagent reagent = screenedWell.getLatestReleasedReagent(); if (reagent != null && reagent instanceof SilencingReagent) { SilencingReagent silencingReagent = (SilencingReagent) reagent; return silencingReagent.getVendorId().getVendorIdentifier(); } } return null; } }); ((HasFetchPaths<LabCherryPick>) Iterables.getLast(labCherryPicksTableColumns)).addRelationshipPath(LabCherryPick.screenerCherryPick.to(ScreenerCherryPick.screenedWell).to(Well.library)); } labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<SilencingReagent,Set<String>>( SilencingReagent.class, new TextSetEntityColumn<SilencingReagent>( SilencingReagent.facilityGenes.toProperty("geneName"), "Gene", "The name of the gene targeted by the screened well", RNAI_COLUMNS_GROUP) { @Override public Set<String> getCellValue(SilencingReagent r) { return r.getFacilityGenes() == null ? null : Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(Iterables.filter(r.getFacilityGenes(), Predicates.notNull()), Gene.ToGeneName), NOT_EMPTY)); } })); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<SilencingReagent,Set<Integer>>( SilencingReagent.class, new IntegerSetEntityColumn<SilencingReagent>( SilencingReagent.facilityGenes.toProperty("entrezgeneId"), "Entrez ID", "The Entrez ID of the gene targeted by the screened well", RNAI_COLUMNS_GROUP) { @Override public Set<Integer> getCellValue(SilencingReagent r) { return r.getFacilityGenes() == null ? null : Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(Iterables.filter(r.getFacilityGenes(), Predicates.notNull()), Gene.ToEntrezgeneId), Predicates.notNull())); } })); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<SilencingReagent,Set<String>>(SilencingReagent.class, new TextSetEntityColumn<SilencingReagent>(SilencingReagent.facilityGenes.to(Gene.entrezgeneSymbols), "Entrez Symbol", "The Entrez symbol of the gene targeted by the screened well", RNAI_COLUMNS_GROUP) { @Override public Set<String> getCellValue(SilencingReagent r) { return r.getFacilityGenes() == null ? null : Sets.newLinkedHashSet(Iterables.filter(Iterables.concat(Iterables.filter(Iterables.transform(Iterables.filter(r.getFacilityGenes(), Predicates.notNull()), Gene.ToEntrezgeneSymbols), Predicates.notNull())), NOT_EMPTY)); } })); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<SilencingReagent,Set<String>>(SilencingReagent.class, new TextSetEntityColumn<SilencingReagent>(SilencingReagent.facilityGenes.to(Gene.genbankAccessionNumbers), "Genbank AccNo", "The Genbank accession number of the gene targeted by the screened well", RNAI_COLUMNS_GROUP) { @Override public Set<String> getCellValue(SilencingReagent r) { return r.getFacilityGenes() == null ? null : Sets.newLinkedHashSet(Iterables.filter(Iterables.concat(Iterables.filter(Iterables.transform(Iterables.filter(r.getFacilityGenes(), Predicates.notNull()), Gene.ToGenbankAccessionNumbers), Predicates.notNull())), NOT_EMPTY)); } })); labCherryPicksTableColumns.add(new LabCherryPickReagentEntityColumn<SilencingReagent,String>(SilencingReagent.class, new TextEntityColumn<SilencingReagent>(RelationshipPath.from(SilencingReagent.class).toProperty("sequence"), "Sequence", "The nucleotide sequence of this silencing reagent", RNAI_COLUMNS_GROUP) { @Override public String getCellValue(SilencingReagent r) { // note: we do not need to check EntityViewPolicy.isAllowedAccessToSilencingReagentSequence, since screeners are allowed access to the sequences they have CP'd, and screeners can only see their own CPR LCPs return r.getSequence(); } })); labCherryPicksTableColumns.add(new BooleanEntityColumn<LabCherryPick>(LabCherryPick.sourceWell.toProperty("deprecated"), "Deprecated", "Whether the cherry picked well has been deprecated (and should not have been cherry picked)", TableColumn.UNGROUPED) { @Override public Boolean getCellValue(LabCherryPick lcp) { return lcp.getSourceWell().isDeprecated(); } }); labCherryPicksTableColumns.get(labCherryPicksTableColumns.size() - 1).setVisible(false); labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>(LabCherryPick.sourceWell.to(Well.deprecationActivity).toProperty("comments"), "Deprecation Reason", "Why the cherry picked well has been deprecated (and should not have been cherry picked)", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { return lcp.getSourceWell().isDeprecated() ? lcp.getSourceWell().getDeprecationActivity().getComments() : null; } }); labCherryPicksTableColumns.get(labCherryPicksTableColumns.size() - 1).setVisible(false); labCherryPicksTableColumns.add(new IntegerEntityColumn<LabCherryPick>(LabCherryPick.assayPlate .toProperty("plateOrdinal"), "Cherry Pick Plate #", "The cherry pick plate number that this cherry pick has been mapped to", TableColumn.UNGROUPED) { @Override public Integer getCellValue(LabCherryPick lcp) { return lcp.isMapped() ? new Integer(lcp.getAssayPlate().getPlateOrdinal() + 1) : null; } }); labCherryPicksTableColumns.add(new IntegerEntityColumn<LabCherryPick>( LabCherryPick.assayPlate.toProperty("attemptOrdinal"), "Attempt #", "The attempt number of the cherry pick plate that this cherry pick has been mapped to", TableColumn.UNGROUPED) { @Override public Integer getCellValue(LabCherryPick lcp) { return lcp.isMapped() ? new Integer(lcp.getAssayPlate().getAttemptOrdinal() + 1) : null; } }); labCherryPicksTableColumns.add(new TextEntityColumn<LabCherryPick>( LabCherryPick.assayPlate, "Destination Well", "The name of the well that this cherry pick has been mapped to", TableColumn.UNGROUPED) { @Override public String getCellValue(LabCherryPick lcp) { return lcp.isMapped() ? lcp.getAssayPlateWellName().toString() : null; } }); return labCherryPicksTableColumns; } private List<List<TableColumn<LabCherryPick,?>>> buildLabCherryPicksTableCompoundSorts(List<TableColumn<LabCherryPick,?>> labCherryPicksTableColumns) { List<List<TableColumn<LabCherryPick,?>>> labCherryPicksTableCompoundSorts = Lists.newArrayList(); // define compound sorts labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(0).add(labCherryPicksTableColumns.get(0)); labCherryPicksTableCompoundSorts.get(0).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(0).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(1).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(1).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(2).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.get(2).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(3).add(labCherryPicksTableColumns.get(3)); labCherryPicksTableCompoundSorts.get(3).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(3).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(4).add(labCherryPicksTableColumns.get(4)); labCherryPicksTableCompoundSorts.get(4).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(4).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(5).add(labCherryPicksTableColumns.get(5)); labCherryPicksTableCompoundSorts.get(5).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(5).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(6).add(labCherryPicksTableColumns.get(6)); labCherryPicksTableCompoundSorts.get(6).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(6).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(7).add(labCherryPicksTableColumns.get(7)); labCherryPicksTableCompoundSorts.get(7).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(7).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(8).add(labCherryPicksTableColumns.get(8)); labCherryPicksTableCompoundSorts.get(8).add(labCherryPicksTableColumns.get(1)); labCherryPicksTableCompoundSorts.get(8).add(labCherryPicksTableColumns.get(2)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(9).add(labCherryPicksTableColumns.get(9)); labCherryPicksTableCompoundSorts.get(9).add(labCherryPicksTableColumns.get(10)); labCherryPicksTableCompoundSorts.get(9).add(labCherryPicksTableColumns.get(11)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(10).add(labCherryPicksTableColumns.get(10)); labCherryPicksTableCompoundSorts.get(10).add(labCherryPicksTableColumns.get(9)); labCherryPicksTableCompoundSorts.get(10).add(labCherryPicksTableColumns.get(11)); labCherryPicksTableCompoundSorts.add(new ArrayList<TableColumn<LabCherryPick,?>>()); labCherryPicksTableCompoundSorts.get(11).add(labCherryPicksTableColumns.get(11)); labCherryPicksTableCompoundSorts.get(11).add(labCherryPicksTableColumns.get(9)); labCherryPicksTableCompoundSorts.get(11).add(labCherryPicksTableColumns.get(10)); return labCherryPicksTableCompoundSorts; } protected Map<LabCherryPick,String> lcpNewSourceCopies = Maps.newHashMap(); @Override protected void doEdit() { lcpNewSourceCopies = Maps.newHashMap(); } @Override protected void doSave() { try { // TODO: make the following two operations atomic if (isRecordOriginalSourceCopyWellsAsEmpty()) { _wellCopyVolumeAdjuster.setWellCopyVolumesToEmpty((AdministratorUser) getScreensaverUser(), getUserEditedLabCherryPickSourceWellCopies(), getLabCherryPickSourceCopyUpdateComments()); } _cherryPickRequestAllocator.allocate(lcpNewSourceCopies, _cherryPickRequest, (AdministratorUser) getScreensaverUser(), getLabCherryPickSourceCopyUpdateComments()); } catch (NoSuchEntityException e) { showMessage("libraries.noSuchCopyForPlate", e.getPropertyValues().get("copy"), e.getPropertyValues().get("plate").toString()); } if (getNestedIn() != null) { getNestedIn().reload(); } } private Set<WellCopy> getUserEditedLabCherryPickSourceWellCopies() { Set<WellCopy> wellCopies = Sets.newHashSet(); for (Map.Entry<LabCherryPick,String> lcpNewSourceCopy : lcpNewSourceCopies.entrySet()) { LabCherryPick lcp = new EntityInflator<LabCherryPick>(_dao, lcpNewSourceCopy.getKey(), true). need(LabCherryPick.wellVolumeAdjustments.to(WellVolumeAdjustment.copy).to(Copy.plates)).need(LabCherryPick.sourceWell).inflate(); if (lcp.getSourceCopy() != null && !NullSafeUtils.nullSafeEquals(lcp.getSourceCopy().getName(), lcpNewSourceCopy.getValue())) { wellCopies.add(new WellCopy(lcp.getSourceWell(), lcp.getSourceCopy())); } } return wellCopies; } public String getLabCherryPickSourceCopyUpdateComments() { return _labCherryPickSourceCopyUpdateComments; } public void setLabCherryPickSourceCopyUpdateComments(String labCherryPickSourceCopyUpdateComments) { _labCherryPickSourceCopyUpdateComments = labCherryPickSourceCopyUpdateComments; } public boolean isRecordOriginalSourceCopyWellsAsEmpty() { return _isRecordOriginalSourceCopyWellsAsEmpty; } public void setRecordOriginalSourceCopyWellsAsEmpty(boolean isRecordOriginalSourceCopyWellsAsEmpty) { _isRecordOriginalSourceCopyWellsAsEmpty = isRecordOriginalSourceCopyWellsAsEmpty; } }