Changeset 5877
- Timestamp:
- Nov 16, 2011, 3:39:47 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 7 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/clients/web/net/sf/basedb/clients/web/PermissionUtil.java
r5685 r5877 187 187 { 188 188 Item.PROTOCOL, Item.HARDWARE, Item.SOFTWARE, 189 Item.ANNOTATIONTYPE, Item.ANNOTATIONTYPECATEGORY, Item.MIMETYPE, Item.REPORTER, 190 Item.REPORTERLIST, Item.REPORTERTYPE, Item.EXTRAVALUETYPE, Item.ITEMSUBTYPE, 189 Item.ANNOTATIONTYPE, Item.ANNOTATIONTYPECATEGORY, Item.MIMETYPE, 190 Item.REPORTER, Item.REPORTERLIST, Item.REPORTERTYPE, Item.REPORTERCLONETEMPLATE, 191 Item.EXTRAVALUETYPE, Item.ITEMSUBTYPE, 191 192 Item.PLATFORM, Item.DATAFILETYPE, Item.QUANTITY, Item.UNIT 192 193 }) -
trunk/src/clients/web/net/sf/basedb/clients/web/extensions/edit/EditUtil.java
r5685 r5877 64 64 Item.DIRECTORY, Item.FILE, Item.FILESERVER, Item.PROJECT, Item.PERMISSIONTEMPLATE, 65 65 Item.PHYSICALBIOASSAY, Item.DERIVEDBIOASSAY, Item.RAWBIOASSAY, 66 Item.FORMULA, Item.REPORTER, Item.REPORTERLIST, 66 Item.FORMULA, Item.REPORTER, Item.REPORTERLIST, Item.REPORTERCLONETEMPLATE, 67 67 Item.EXPERIMENT, Item.TRANSFORMATION, Item.BIOASSAYSET, Item.BIOASSAY, 68 68 Item.USER, Item.GROUP, Item.ROLE, Item.QUOTA, Item.SOFTWARE, Item.HARDWARE, -
trunk/src/clients/web/net/sf/basedb/clients/web/extensions/toolbar/ToolbarUtil.java
r5685 r5877 59 59 Item.TRANSFORMATION, Item.EXTRAVALUE, Item.SPOTDATA, 60 60 Item.RAWBIOASSAY, Item.RAWDATA, Item.FORMULA, 61 Item.REPORTER, Item.REPORTERLIST, Item.REPORTERSCORE, 61 Item.REPORTER, Item.REPORTERLIST, Item.REPORTERSCORE, Item.REPORTERCLONETEMPLATE, 62 62 Item.DERIVEDBIOASSAY, Item.PHYSICALBIOASSAY, 63 63 Item.BIOSOURCE, Item.SAMPLE, Item.EXTRACT, -
trunk/src/clients/web/net/sf/basedb/clients/web/resources/common.properties
r5685 r5877 156 156 item.news News 157 157 item.news+ News 158 item.reporterclonetemplate Reporter clone template 159 item.reporterclonetemplate+ Reporter clone templates 158 160 item.diskusage Disk usage 159 161 item.diskusage+ Disk usage -
trunk/src/clients/web/net/sf/basedb/clients/web/resources/menu.properties
r5685 r5877 167 167 news.tooltip.1 Administrate news 168 168 news.tooltip.0 You do not have permission to administrate news 169 reporterclonetemplates.tooltip.1 Administrate reporter clone templates 170 reporterclonetemplates.tooltip.0 You do not have permission to administrate reporter clone templates 169 171 # ------------ 170 172 diskusage.tooltip.1 Check disk usage -
trunk/src/core/net/sf/basedb/core/ClonedProperty.java
r5876 r5877 21 21 */ 22 22 package net.sf.basedb.core; 23 24 import java.util.ArrayList; 25 import java.util.Collections; 26 import java.util.List; 23 27 24 28 import net.sf.basedb.core.Formula.AverageMethod; … … 38 42 public class ClonedProperty 39 43 extends ExtendedProperty 44 implements Comparable<ClonedProperty> 40 45 { 41 46 /** … … 66 71 Type.STRING, ReporterData.MAX_NAME_LENGTH, false, AverageMethod.NONE); 67 72 } 68 if (SYMBOL.equals(name))73 else if (SYMBOL.equals(name)) 69 74 { 70 75 property = new ClonedProperty(SYMBOL, "Symbol", "", "symbol", … … 79 84 80 85 /** 81 Create a cloned property repr sentation of an extended property.86 Create a cloned property representation of an extended property. 82 87 @param name The name of the extended property 83 88 @return A cloned property view of the extended property … … 95 100 } 96 101 102 /** 103 Create a cloned property from either an extended or static property. 104 This method will first check if an extended property with the given 105 name exists. 106 @param name The name of the property 107 @return A cloned property view of the extended or static property 108 @throws ItemNotFoundException If a property with the given name 109 doesn't exist 110 */ 111 public static ClonedProperty create(String name) 112 { 113 ClonedProperty property = null; 114 ExtendedProperty ep = ExtendedProperties.getProperty("ReporterData", name); 115 if (ep == null) 116 { 117 property = createFromRegular(name); 118 } 119 else 120 { 121 property = new ClonedProperty(ep); 122 } 123 return property; 124 } 125 126 /** 127 Get a list containing cloned property representation for all static and 128 extended properties. 129 */ 130 public static List<ClonedProperty> getAll() 131 { 132 List<ExtendedProperty> extended = ExtendedProperties.getProperties("ReporterData"); 133 List<ClonedProperty> all = new ArrayList<ClonedProperty>(extended.size() + 2); 134 135 for (ExtendedProperty ep : extended) 136 { 137 all.add(new ClonedProperty(ep)); 138 } 139 all.add(createFromRegular(NAME)); 140 all.add(createFromRegular(SYMBOL)); 141 Collections.sort(all); 142 return all; 143 } 144 145 private final boolean isExtendedProperty; 146 147 /** 148 Create a cloned property representation of a static property. 149 */ 97 150 private ClonedProperty(String propertyName, String title, String description, 98 151 String column, Type valueType, int length, boolean nullable, AverageMethod averageMethod) … … 101 154 valueType, length, nullable, true, true, 102 155 averageMethod, null); 156 this.isExtendedProperty = false; 103 157 } 104 158 … … 112 166 p.getType(), p.getLength(), p.isNullable(), true, true, 113 167 p.getAverageMethod(), null); 168 this.isExtendedProperty = true; 114 169 } 115 170 … … 125 180 Type.fromValue(d.getValueType()), d.getLength(), d.isNullable(), true, true, 126 181 AverageMethod.fromValue(d.getAverageMethod()), null); 182 this.isExtendedProperty = d.isExtendedProperty(); 127 183 } 128 184 … … 140 196 data.setNullable(isNullable()); 141 197 data.setAverageMethod(getAverageMethod().getValue()); 198 data.setExtendedProperty(isExtendedProperty()); 142 199 return data; 143 200 } 144 201 202 /** 203 Is this cloned property an extended property or a "static" property? 204 */ 205 public boolean isExtendedProperty() 206 { 207 return isExtendedProperty; 208 } 209 210 /** 211 Check if this cloned property still exists. A cloned property that 212 has been added to a template is not automatically removed if the 213 extended properties configuration is changed. 214 */ 215 public boolean exists() 216 { 217 return !isExtendedProperty() || ExtendedProperties.getProperty("ReporterData", getName()) != null; 218 } 219 220 /* 221 From the Object class 222 --------------------- 223 */ 145 224 @Override 146 225 public String toString() … … 148 227 return getName(); 149 228 } 150 229 230 @Override 231 public boolean equals(Object o) 232 { 233 if (this == o) return true; 234 if (o == null) return false; 235 if (o.getClass() != ClonedProperty.class) return false; 236 ClonedProperty other = (ClonedProperty)o; 237 return getName().equals(other.getName()); 238 } 239 240 @Override 241 public int hashCode() 242 { 243 return getName().hashCode(); 244 } 245 // --------------------- 246 /* 247 From the Comparable interface 248 ----------------------------- 249 */ 250 @Override 251 public int compareTo(ClonedProperty o) 252 { 253 return getName().compareTo(o.getName()); 254 } 255 // ----------------------------- 151 256 } -
trunk/src/core/net/sf/basedb/core/DbControl.java
r5689 r5877 120 120 121 121 /** 122 List of actions that should be performed when the 123 transaction commits or rollbacks. 124 */ 125 private List<TransactionalAction> transactionalActions; 126 127 /** 122 128 Is the connection closed or not? 123 129 */ … … 317 323 hTransaction = null; 318 324 325 // Call TransactionalAction.onRollback() 326 if (transactionalActions != null) 327 { 328 for (TransactionalAction action : transactionalActions) 329 { 330 try 331 { 332 action.onRollback(); 333 } 334 catch (RuntimeException ex) 335 { 336 log.warn("Action failed: " + action, ex); 337 } 338 } 339 } 319 340 for (Map.Entry<BasicItem,Transactional.Action> entry : commitQueue.entrySet()) 320 341 { … … 334 355 if (batchers != null) batchers.clear(); 335 356 if (saveIfQueue != null) saveIfQueue.clear(); 357 if (transactionalActions != null) transactionalActions.clear(); 336 358 saveIfQueue = null; 337 359 commitQueue = null; 360 transactionalActions = null; 338 361 itemCache = null; 339 362 batchers = null; 340 363 isClosed = true; 341 364 isConnected = false; 365 } 366 367 /** 368 Add a transactional action to this DbControl. 369 @since 3.1 370 */ 371 public void addTransactionalAction(TransactionalAction action) 372 { 373 if (transactionalActions == null) 374 { 375 transactionalActions = new ArrayList<TransactionalAction>(); 376 } 377 transactionalActions.add(action); 342 378 } 343 379 … … 436 472 } 437 473 } 474 // Call TransactionalAction.onBeforeCommit() 475 if (transactionalActions != null) 476 { 477 for (TransactionalAction action : transactionalActions) 478 { 479 action.onBeforeCommit(); 480 } 481 } 438 482 HibernateUtil.commit(hTransaction); 439 483 HibernateUtil.close(hSession); … … 442 486 hTransaction = null; 443 487 } 444 catch ( BaseException ex)488 catch (RuntimeException ex) 445 489 { 446 490 if (afterCommitQueue != null) commitQueue.putAll(afterCommitQueue); … … 448 492 close(); 449 493 throw ex; 494 } 495 // Call TransactionalAction.onAfterCommit() 496 if (transactionalActions != null) 497 { 498 for (TransactionalAction action : transactionalActions) 499 { 500 try 501 { 502 action.onAfterCommit(); 503 } 504 catch (RuntimeException ex) 505 { 506 log.warn("Action failed: " + action, ex); 507 } 508 } 450 509 } 451 510 cleanUp(); -
trunk/src/core/net/sf/basedb/core/Experiment.java
r5876 r5877 25 25 26 26 import net.sf.basedb.core.data.ExperimentData; 27 import net.sf.basedb.core.data.ReporterCloneTemplateData;28 27 import net.sf.basedb.core.hibernate.TypeWrapper; 29 28 import net.sf.basedb.core.query.Restrictions; … … 803 802 } 804 803 805 /** 806 Create a reporter clone table in the dynamic database for this 807 experiment and populate it with the current reporter annotations 808 for all reporters that are part of the experiment. This method will 809 create an immutable copy of the template so that we can always know 810 which fields that have been cloned, even if the template is modified. 804 private ReporterCloneBatcher reporterCloneBatcher; 805 806 /** 807 Get a batcher for managing cloned reporter information for this experiment. 808 Note that multiple calls to this method will return the same batcher instance. 811 809 812 @param dc A DbControl to use for database access 813 @param template The template that decides which fieds that 814 are cloned 815 @param progress An optional progress reporter 816 @return The number of reporters that was cloned 810 @param dc The DbControl to use for database access 811 @return A reporter clone batcher 817 812 @since 3.1 818 813 */ 819 public int cloneReporters(DbControl dc, ReporterCloneTemplate template, ProgressReporter progress) 820 { 821 VirtualDb db = VirtualDb.getById(dc, getData().getVirtualDb().getId()); 822 823 if (db.hasClonedReporters()) 814 public ReporterCloneBatcher getReporterCloneBatcher(DbControl dc) 815 { 816 if (reporterCloneBatcher == null) 824 817 { 825 // Remove existing clone table 826 oldReporterCloneTable = VirtualTable.CLONED_REPORTERS.getTableName(db); 827 ReporterCloneTemplateData oldClone = db.getData().getReporterCloneTemplate(); 828 HibernateUtil.deleteData(dc.getHibernateSession(), oldClone); 829 this.addBytes(-oldClone.getBytes()); 818 reporterCloneBatcher = new ReporterCloneBatcher(dc, this); 830 819 } 831 832 if (progress != null) progress.display(0, "Creating clone table..."); 833 // Create a copy of the template 834 ReporterCloneTemplateData copy = template.createLockedCopy(); 835 db.getData().setReporterCloneTemplate(copy); 836 HibernateUtil.saveData(dc.getHibernateSession(), copy); 837 838 // Create a new clone table 839 newReporterCloneTable = HibernateUtil.createVirtualTable(db, VirtualTable.CLONED_REPORTERS); 840 841 // Clone reporter information 842 return new ReporterCloneBatcher(dc, this).cloneReporters(progress); 843 } 844 820 return reporterCloneBatcher; 821 } 845 822 846 823 /** -
trunk/src/core/net/sf/basedb/core/Install.java
r5876 r5877 362 362 createRoleKey(Item.REPORTER, "Reporters", "Gives access to reporter", guests_use_administrators_all); 363 363 createRoleKey(Item.REPORTERLIST, "Reporter lists", "Gives access to reporter lists", users_create); 364 createRoleKey(Item.REPORTERCLONETEMPLATE, "Reporter clone template ", "Gives access to reporter clone templates", guests_use_power_users_all);364 createRoleKey(Item.REPORTERCLONETEMPLATE, "Reporter clone templates", "Gives access to reporter clone templates", power_users_create); 365 365 366 366 // Array LIMS - plates -
trunk/src/core/net/sf/basedb/core/ReporterCloneBatcher.java
r5876 r5877 26 26 import java.util.List; 27 27 28 import net.sf.basedb.core.data.ReporterCloneTemplateData; 28 29 import net.sf.basedb.core.hibernate.TypeWrapper; 29 30 import net.sf.basedb.core.query.Dynamic; … … 58 59 59 60 /** 60 The number of bytes this batcher has added to the experiment.61 */62 private long bytes = 0;63 64 /**65 61 The statement that inserts cloned reporter data. 66 62 <pre class="code"> … … 81 77 { 82 78 super(); 83 this.experiment = experiment;79 this.experiment = Experiment.getById(dc, experiment.getId()); 84 80 this.virtualDb = experiment.getVirtualDb(); 85 81 this.bytesPerRow = VirtualTable.CLONED_REPORTERS.getBytesPerRow(virtualDb); … … 118 114 throws BaseException 119 115 { 120 virtualDb.getReporterCloneTemplate().addBytes(bytes);121 experiment.addBytes(bytes);122 123 116 try 124 117 { … … 134 127 LogUtil.logSQLExceptionChain(logSql, ex); 135 128 } 136 if (!getDbControl().isRolledBack() )129 if (!getDbControl().isRolledBack() && virtualDb.hasClonedReporters()) 137 130 { 138 131 String catalog = Application.getDynamicCatalog(); … … 145 138 146 139 /** 147 Clone the current reporter information to the dynamic database. 140 Get the current experiment this batcher is used with. 141 */ 142 public Experiment getExperiment() 143 { 144 return experiment; 145 } 146 147 /** 148 Drop the cloned reporter information from the dynamic database. If the 149 current experiment doesn't have any cloned reporters, nothing is done. 150 */ 151 public void dropClonedReporters() 152 { 153 DbControl dc = getDbControl(); 154 155 if (virtualDb.hasClonedReporters()) 156 { 157 // Schedule the old table for removal on successful commit 158 String oldTableName = VirtualTable.CLONED_REPORTERS.getTableName(virtualDb); 159 dc.addTransactionalAction(new DropDynamicTableAction(oldTableName, true, false)); 160 161 // Delete the old template 162 ReporterCloneTemplateData oldClone = virtualDb.getData().getReporterCloneTemplate(); 163 HibernateUtil.deleteData(dc.getHibernateSession(), oldClone); 164 virtualDb.getData().setReporterCloneTemplate(null); 165 166 // Return used bytes to the experiment 167 experiment.addBytes(-oldClone.getBytes()); 168 } 169 } 170 171 /** 172 Create a reporter clone table in the dynamic database for this 173 experiment and populate it with the current reporter annotations 174 for all reporters that are part of the experiment. This method will 175 create an immutable copy of the template so that we can always know 176 which fields that have been cloned, even if the template is modified. 177 If there already is a cloned reporter information it will be removed. 178 148 179 @param progress An optional progress reporter 149 180 @return The number of cloned reporters 150 181 */ 151 int cloneReporters(ProgressReporter progress) 152 { 182 public int cloneReporters(ReporterCloneTemplate template, ProgressReporter progress) 183 { 184 DbControl dc = getDbControl(); 185 186 // Drop existing cloned reporters (if any) 187 dropClonedReporters(); 188 189 // Create a copy of the template 190 ReporterCloneTemplateData copy = template.createLockedCopy(); 191 virtualDb.getData().setReporterCloneTemplate(copy); 192 HibernateUtil.saveData(dc.getHibernateSession(), copy); 193 194 // Create the clone table... 195 if (progress != null) progress.display(0, "Creating clone table..."); 196 String cloneTableName = HibernateUtil.createVirtualTable(virtualDb, VirtualTable.CLONED_REPORTERS); 197 // ...and an action that drops it in the case of a rollback 198 dc.addTransactionalAction(new DropDynamicTableAction(cloneTableName, false, true)); 199 200 long bytes = 0; 153 201 int insertCount = 0; 154 202 int batchSize = getBatchSize(); 155 203 try 156 204 { 157 DbControl dc = getDbControl();158 205 DynamicPositionQuery query = buildSelectQuery(); 159 206 long totalCount = query.count(dc); … … 199 246 } 200 247 248 virtualDb.getReporterCloneTemplate().addBytes(bytes); 249 experiment.addBytes(bytes); 250 201 251 flushInternal(); 202 252 … … 275 325 } 276 326 277 278 327 return query; 279 328 } -
trunk/src/core/net/sf/basedb/core/ReporterCloneTemplate.java
r5876 r5877 23 23 24 24 import java.util.ArrayList; 25 import java.util.Collections; 25 26 import java.util.Date; 26 27 import java.util.List; … … 37 38 A reporter clone template is a definition of which reporter properties/annotations 38 39 that should be cloned to a per-experiment table in the dynamic database. The 39 cloning operation is initiated with {@link Experiment# cloneReporters(DbControl,40 ReporterCloneTemplate, ProgressReporter)}.The reporter internal and external id40 cloning operation is initiated with {@link Experiment#getReporterCloneBatcher(DbControl)}. 41 The reporter internal and external id 41 42 are always cloned and should not be part of the template. The cloning operation 42 43 also creates a locked copy of the template, so that it is possible to make modifications … … 266 267 267 268 /** 269 Check if this template contains a cloned property with 270 the given name. 271 @param propertyName The property name to check 272 @return TRUE if the template contains the given property, FALSE if not 273 */ 274 public boolean hasClonedProperty(String propertyName) 275 { 276 return getData().getProperties().containsKey(propertyName); 277 } 278 279 /** 268 280 Get a list with all cloned properties in this template. The returned list 269 281 is a copy of the information in this template and modifications to the list … … 277 289 for (Map.Entry<String, ReporterClonePropertyData> data : properties) 278 290 { 279 list.add(new ClonedProperty(data.getKey(), data.getValue())); 291 ClonedProperty cp = new ClonedProperty(data.getKey(), data.getValue()); 292 int insertIndex = Collections.binarySearch(list, cp); 293 if (insertIndex < 0) list.add(-1-insertIndex, cp); 280 294 } 281 295 return list; -
trunk/src/core/net/sf/basedb/core/data/ReporterClonePropertyData.java
r5876 r5877 140 140 } 141 141 142 142 private boolean extendedProperty; 143 /** 144 If the column is nullable or not. 145 @hibernate.property column="`extended_property`" type="boolean" not-null="true" update="false" 146 */ 147 public boolean isExtendedProperty() 148 { 149 return extendedProperty; 150 } 151 public void setExtendedProperty(boolean extendedProperty) 152 { 153 this.extendedProperty = extendedProperty; 154 } 155 143 156 } -
trunk/src/core/net/sf/basedb/core/data/ReporterCloneTemplateData.java
r5876 r5877 42 42 public class ReporterCloneTemplateData 43 43 extends CommonData 44 implements RegisteredData 44 implements RegisteredData, LoggableData 45 45 { 46 46 public ReporterCloneTemplateData() -
trunk/src/test/TestReporterCloneTemplate.java
r5876 r5877 31 31 import net.sf.basedb.core.ItemResultList; 32 32 import net.sf.basedb.core.Permission; 33 import net.sf.basedb.core.ReporterCloneBatcher; 33 34 import net.sf.basedb.core.ReporterCloneTemplate; 34 35 import net.sf.basedb.util.ConsoleProgressReporter; … … 81 82 // Standard test: Delete 82 83 if (TestUtil.waitBeforeDelete()) TestUtil.waitForEnter(); 84 test_remove_cloned_reporters(experimentId); 83 85 test_delete(id); 84 85 86 } 86 87 finally … … 244 245 Experiment exp = Experiment.getById(dc, experimentId); 245 246 246 exp.cloneReporters(dc, rct, TestUtil.getSilent() ? null : new ConsoleProgressReporter()); 247 ReporterCloneBatcher batcher = exp.getReporterCloneBatcher(dc); 248 batcher.cloneReporters(rct, TestUtil.getSilent() ? null : new ConsoleProgressReporter()); 247 249 248 250 dc.commit(); … … 260 262 if (dc != null) dc.close(); 261 263 } 262 264 } 263 265 264 } 265 266 266 static void test_remove_cloned_reporters(int experimentId) 267 { 268 if (experimentId == 0) return; 269 DbControl dc = null; 270 try 271 { 272 dc = TestUtil.getDbControl(); 273 Experiment exp = Experiment.getById(dc, experimentId); 274 275 ReporterCloneBatcher batcher = exp.getReporterCloneBatcher(dc); 276 batcher.dropClonedReporters(); 277 278 dc.commit(); 279 write("--Remove cloned reporters OK"); 280 } 281 catch (Throwable ex) 282 { 283 write("--Remove cloned reporters FAILED"); 284 ex.printStackTrace(); 285 ok = false; 286 } 287 finally 288 { 289 if (dc != null) dc.close(); 290 } 291 } 292 267 293 } -
trunk/www/include/menu.jsp
r5708 r5877 954 954 final boolean hasClients = sc.hasPermission(Permission.READ, Item.CLIENT); 955 955 final boolean hasNews = sc.hasPermission(Permission.READ, Item.NEWS); 956 final boolean hasReporterCloneTemplates = !sc.hasPermission(Permission.DENIED, Item.REPORTERCLONETEMPLATE); 956 957 final boolean hasDiskUsage = sc.hasPermission(Permission.READ, Item.DISKUSAGE); 957 958 final Client currentClient = Client.getById(dc, sc.getClientId()); … … 960 961 final boolean hasAdministrate = 961 962 hasUsers || hasGroups || hasRoles || hasQuota || hasTypes || hasPlugins || 962 hasSoftware || hasHardware || hasProtocols || hasClients || hasNews || 963 hasSoftware || hasHardware || hasProtocols || hasClients || hasNews || hasReporterCloneTemplates || 963 964 hasDiskUsage || hasServer || hasTopPlatforms; 964 965 … … 1031 1032 tooltip="<%=menu.getString("news.tooltip", hasNews)%>" 1032 1033 enabled="<%=hasNews%>" 1034 /> 1035 <m:menuitem 1036 title="<%=common.getString("item.reporterclonetemplate+")%>" 1037 onclick="<%="Menu.openUrl('"+root+"admin/reporterclonetemplates/index.jsp?ID="+ID+"')"%>" 1038 tooltip="<%=menu.getString("reporterclonetemplates.tooltip", hasReporterCloneTemplates)%>" 1039 enabled="<%=hasReporterCloneTemplates%>" 1033 1040 /> 1034 1041 <m:menuseparator /> -
trunk/www/include/scripts/main.js
r5722 r5877 615 615 this.controllers['ANNOTATION'] = { url:'common/annotations/index.jsp', width:700, height:480, edit:true, popup:true }; 616 616 this.controllers['ITEMSUBTYPE'] = { url:'admin/itemsubtypes/index.jsp', width:640, height:440 }; 617 this.controllers['REPORTERCLONETEMPLATE'] = { url:'admin/reporterclonetemplates/index.jsp', width:640, height:440 }; 617 618 } 618 619 -
trunk/www/views/experiments/list_experiments.jsp
r5590 r5877 283 283 /> 284 284 <tbl:columndef 285 id="reporterCloneTemplate" 286 property="virtualDb.reporterCloneTemplate.name" 287 datatype="string" 288 title="Reporter clone template" 289 sortable="true" 290 filterable="true" 291 exportable="true" 292 /> 293 <tbl:columndef 285 294 id="title" 286 295 property="title" … … 572 581 enablePropertyLink="<%=mode.hasPropertyLink()%>" 573 582 /></tbl:cell> 583 <tbl:cell column="reporterCloneTemplate" 584 ><base:propertyvalue 585 item="<%=item%>" 586 property="virtualDb.reporterCloneTemplate" 587 enableEditLink="<%=mode.hasEditLink()%>" 588 enablePropertyLink="<%=mode.hasPropertyLink()%>" 589 /></tbl:cell> 574 590 <tbl:cell column="title"><%=HTML.encodeTags(item.getTitle())%></tbl:cell> 575 591 <tbl:cell column="abstract"><%=HTML.encodeTags(item.getAbstract())%></tbl:cell> -
trunk/www/views/experiments/view_experiment.jsp
r5812 r5877 394 394 </tr> 395 395 <tr> 396 <td class="prompt">Reporter clone template</td> 397 <td><base:propertyvalue item="<%=experiment%>" property="virtualDb.reporterCloneTemplate" nulltext="<i>- no cloned reporters -</i>" /></td> 398 </tr> 399 <tr> 396 400 <td class="prompt">Bytes</td> 397 401 <td><%=Values.formatBytes(experiment.getBytes())%></td>
Note: See TracChangeset
for help on using the changeset viewer.