From: <vga...@us...> - 2010-02-03 14:53:03
|
Revision: 482 http://treebase.svn.sourceforge.net/treebase/?rev=482&view=rev Author: vgapeyev Date: 2010-02-03 14:52:56 +0000 (Wed, 03 Feb 2010) Log Message: ----------- Changed to a custom ID generator, which relies on the naming convention to translate a table name XXX to the sequence name XXX_id_sequence. Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java Added Paths: ----------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TB2SequenceGenerator.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2010-02-02 20:54:48 UTC (rev 481) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2010-02-03 14:52:56 UTC (rev 482) @@ -15,6 +15,7 @@ import org.cipres.treebase.NamespacedGUID; import org.cipres.treebase.PhyloWSPath; import org.cipres.treebase.TreebaseIDString; +import org.hibernate.annotations.GenericGenerator; /** * The abstract super class for all persisted domain objects. @@ -53,8 +54,9 @@ * @see org.cipres.treebase.domain.TBPersistable#getId() */ @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE) - public Long getId() { + @GenericGenerator(name="TB2SEQGEN", strategy = "org.cipres.treebase.domain.TB2SequenceGenerator") + @GeneratedValue(generator="TB2SEQGEN") + public Long getId() { return mId; } Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TB2SequenceGenerator.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TB2SequenceGenerator.java (rev 0) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TB2SequenceGenerator.java 2010-02-03 14:52:56 UTC (rev 482) @@ -0,0 +1,34 @@ +package org.cipres.treebase.domain; + +import java.util.Properties; + +import org.hibernate.MappingException; +import org.hibernate.type.Type; +import org.hibernate.dialect.Dialect; +import org.hibernate.id.PersistentIdentifierGenerator; +import org.hibernate.id.SequenceGenerator; + + + +/** Custom id generator that translates table name to the name of an appropriate sequence. + * Code taken from https://www.hibernate.org/296.html 2010-02-01, where it was attributed to Mr. Rob Hasselbaum. + * Usage is in AbstractPersistedObject.java. + * --VG + * */ +public class TB2SequenceGenerator extends SequenceGenerator { + + /** + * If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we + * assign one based on the table name. + */ + public void configure(Type type, Properties params, Dialect dialect) throws MappingException { + if(params.getProperty(SEQUENCE) == null || params.getProperty(SEQUENCE).length() == 0) { + String tableName = params.getProperty(PersistentIdentifierGenerator.TABLE); + if(tableName != null) { + String seqName = tableName + "_id_sequence"; + params.setProperty(SEQUENCE, seqName); + } + } + super.configure(type, params, dialect); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rv...@us...> - 2010-06-01 20:05:39
|
Revision: 702 http://treebase.svn.sourceforge.net/treebase/?rev=702&view=rev Author: rvos Date: 2010-06-01 20:05:30 +0000 (Tue, 01 Jun 2010) Log Message: ----------- Fixes for issue 2974771, ELException when getting phyloWSPath of the context object that defines the focal object (e.g. the containing study). This is addressed by adding the @Fetch(FetchMode.JOIN) annotation. Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTree.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java 2010-06-01 17:11:18 UTC (rev 701) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java 2010-06-01 20:05:30 UTC (rev 702) @@ -18,6 +18,8 @@ import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.Index; import org.cipres.treebase.domain.AbstractPersistedObject; @@ -78,6 +80,7 @@ // the nullable = false cause the add error code -407, the matrix column is null! // @JoinColumn(name = "MATRIX_ID", insertable = false, updatable = false, nullable = false) @Index(name = "COLUMN_M_IDX") + @Fetch(FetchMode.JOIN) public CharacterMatrix getMatrix() { return mMatrix; } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java 2010-06-01 17:11:18 UTC (rev 701) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java 2010-06-01 20:05:30 UTC (rev 702) @@ -20,6 +20,8 @@ import javax.persistence.Transient; import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.Index; import org.cipres.treebase.domain.AbstractPersistedObject; @@ -119,6 +121,7 @@ @ManyToOne @JoinColumn(name = "MATRIXCOLUMN_ID", nullable = true) @Index(name = "Element_COL_IDX") + @Fetch(FetchMode.JOIN) public MatrixColumn getColumn() { return mColumn; } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTree.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTree.java 2010-06-01 17:11:18 UTC (rev 701) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTree.java 2010-06-01 20:05:30 UTC (rev 702) @@ -458,6 +458,7 @@ */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "STUDY_ID") + @Fetch(FetchMode.JOIN) public Study getStudy() { return mStudy; } @@ -813,6 +814,7 @@ @Override @Transient public Study getContext() { + // org.hibernate.LazyInitializationException return getStudy(); } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java 2010-06-01 17:11:18 UTC (rev 701) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java 2010-06-01 20:05:30 UTC (rev 702) @@ -17,6 +17,8 @@ import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.Index; import org.cipres.treebase.TreebaseUtil; @@ -168,6 +170,7 @@ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PHYLOTREE_ID", nullable = false) @Index(name = "TNODE_TREE_IDX") + @Fetch(FetchMode.JOIN) public PhyloTree getTree() { return mTree; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rv...@us...> - 2012-01-20 14:04:40
|
Revision: 1017 http://treebase.svn.sourceforge.net/treebase/?rev=1017&view=rev Author: rvos Date: 2012-01-20 14:04:31 +0000 (Fri, 20 Jan 2012) Log Message: ----------- Forgot to set the @Transient annotation on the getStudy() method in these. Hopefully this addresses the build issues. Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2012-01-20 01:47:48 UTC (rev 1016) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2012-01-20 14:04:31 UTC (rev 1017) @@ -170,6 +170,7 @@ * (non-Javadoc) * @see org.cipres.treebase.domain.TBPersistable#getStudy() */ + @Transient public Study getStudy() { return null; } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java 2012-01-20 01:47:48 UTC (rev 1016) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java 2012-01-20 14:04:31 UTC (rev 1017) @@ -7,6 +7,7 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; +import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -115,6 +116,7 @@ mMatrix = pNewMatrix; } + @Transient public Study getStudy() { return getMatrix().getStudy(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rv...@us...> - 2012-01-19 22:38:23
|
Revision: 1014 http://treebase.svn.sourceforge.net/treebase/?rev=1014&view=rev Author: rvos Date: 2012-01-19 22:38:16 +0000 (Thu, 19 Jan 2012) Log Message: ----------- Adding interface method and implementations for getStudy(). This so we can determine for any object i. whether it logically belongs to a Study (e.g. User objects don't, but trees do) ii. subsequently whether the data object is under embargo. Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TBPersistable.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/RowSegment.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalysisStep.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalyzedData.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/Study.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/TreeBlock.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/AbstractPersistedObject.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -18,6 +18,7 @@ import org.cipres.treebase.PhyloWSPath; import org.cipres.treebase.TreebaseIDString; import org.cipres.treebase.TreebaseUtil; +import org.cipres.treebase.domain.study.Study; import org.hibernate.annotations.GenericGenerator; /** @@ -165,4 +166,12 @@ return this.getNamespacedGUID().toString(); } + /* + * (non-Javadoc) + * @see org.cipres.treebase.domain.TBPersistable#getStudy() + */ + public Study getStudy() { + return null; + } + } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TBPersistable.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TBPersistable.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/TBPersistable.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -4,6 +4,7 @@ import org.cipres.treebase.NamespacedGUID; import org.cipres.treebase.PhyloWSPath; import org.cipres.treebase.TreebaseIDString; +import org.cipres.treebase.domain.study.Study; /** * A tagging interface for all persisted treebase objects. @@ -31,11 +32,6 @@ public static final int CITATION_TITLE_COLUMN_LENGTH = 500; public static final int CITATION_ABSTRACT_COLUMN_LENGTH = 10000; - /** - * Return the id. - * - * @return - */ public Long getId(); public TreebaseIDString getTreebaseIDString (); @@ -44,6 +40,20 @@ public PhyloWSPath getPhyloWSPath (); + /** + * Is an object that implements this is logically + * part of a containing object (e.g. a node is part + * of a tree), this method returns that containing + * object. + * @return + */ public TBPersistable getContext (); + + /** + * If an object that implements this logically belongs to a Study, + * this method returns that Study. Otherwise returns null. + * @return + */ + public Study getStudy(); } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/DistanceMatrixElement.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -12,6 +12,7 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import org.cipres.treebase.domain.AbstractPersistedObject; +import org.cipres.treebase.domain.study.Study; import org.cipres.treebase.domain.taxon.TaxonLabel; /** @@ -113,5 +114,9 @@ public void setMatrix(DistanceMatrix pNewMatrix) { mMatrix = pNewMatrix; } + + public Study getStudy() { + return getMatrix().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixColumn.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -23,6 +23,7 @@ import org.hibernate.annotations.Index; import org.cipres.treebase.domain.AbstractPersistedObject; +import org.cipres.treebase.domain.study.Study; /** * MatrixColumn.java @@ -153,4 +154,9 @@ if (theMatrix == null) { return null; } return theMatrix.getColumnsReadOnly().indexOf(this); } + + @Transient + public Study getStudy() { + return getMatrix().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixElement.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -25,6 +25,7 @@ import org.hibernate.annotations.Index; import org.cipres.treebase.domain.AbstractPersistedObject; +import org.cipres.treebase.domain.study.Study; /** * MatrixElement.java @@ -157,4 +158,9 @@ public CharacterMatrix getContext() { return getColumn().getMatrix(); } + + @Transient + public Study getStudy() { + return getContext().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import javax.persistence.AttributeOverride; @@ -28,6 +29,7 @@ import org.cipres.treebase.TreebaseUtil; import org.cipres.treebase.domain.AbstractPersistedObject; +import org.cipres.treebase.domain.study.Study; import org.cipres.treebase.domain.taxon.TaxonLabel; /** @@ -149,10 +151,14 @@ /** * Represents all the elements as symbols in one string. - * For one character one symbol, This can handle 512k size of characters in a matrix. + * This can handle 512k size of characters in a matrix. * * It is precalculated and stored for faster generating nexus blocks. * + * Note that for ambiguous states (e.g. N in a DNA sequence) this + * returns a list of all fundamental states that comprise the ambiguous + * state, i.e. instead of N, this returns {ACGT} + * * @return String */ @Lob @@ -160,6 +166,51 @@ public String getSymbolString() { return mSymbolString; } + + + /** + * Represents all the elements as symbols in one string. + * + * Note that this method post-processes the output of getSymbolString(), i.e. + * if that method returns an {ACGT} this method replaces that with whatever + * ambiguity mapping was provided. E.g. if the map pMapping holds a slot for + * "ACGT" => "N" this method will return that N instead. + * + * @return String + */ + @Transient + public String getSymbolString(Map<String,String> pMapping) { + String inputString = getSymbolString(); + StringBuffer outputString = new StringBuffer(); + List<Character> ambiguous = new ArrayList<Character>(); + boolean isAmbiguous = false; + for ( int i = 0; i < inputString.length(); i++ ) { + char current = inputString.charAt(i); + if ( current == '{' ) { + isAmbiguous = true; + ambiguous.clear(); + continue; + } + if ( current == '}' ) { + isAmbiguous = false; + Collections.sort(ambiguous); + StringBuffer ambigBuffer = new StringBuffer(); + ambigBuffer.append(ambiguous.toArray(new Character[ambiguous.size()])); + String ambigString = ambigBuffer.toString(); + if ( pMapping.containsKey(ambigString) ) { + outputString.append(pMapping.get(ambigString)); + } + continue; + } + if ( isAmbiguous ) { + ambiguous.add(current); + } + else { + outputString.append(current); + } + } + return outputString.toString(); + } /** * Set the SymbolString field. @@ -356,4 +407,9 @@ if (syms == null) { return "(no data)"; } return syms.length() >= DISPLAY_STRING_LENGTH ? syms.substring(0, DISPLAY_STRING_LENGTH) : syms; } + + @Transient + public Study getStudy() { + return getMatrix().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/RowSegment.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/RowSegment.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/RowSegment.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -23,6 +23,7 @@ import org.cipres.treebase.domain.AbstractPersistedObject; import org.cipres.treebase.domain.TBPersistable; import org.cipres.treebase.domain.matrix.RowSegmentService.RowSegmentField; +import org.cipres.treebase.domain.study.Study; import org.cipres.treebase.domain.taxon.SpecimenLabel; import org.cipres.treebase.domain.taxon.TaxonLabel; import org.cipres.treebase.framework.ExecutionResult; @@ -563,4 +564,9 @@ public void setChecked(boolean pChecked) { mChecked = pChecked; } + + @Transient + public Study getStudy() { + return getMatrixRow().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalysisStep.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalysisStep.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalysisStep.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -354,5 +354,10 @@ if (index == -1) return null; return index; } + + @Transient + public Study getStudy() { + return getAnalysis().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalyzedData.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalyzedData.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/AnalyzedData.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -161,4 +161,9 @@ */ @Transient public abstract String getDisplayName(); + + @Transient + public Study getStudy() { + return getAnalysisStep().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/Study.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/Study.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/study/Study.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -748,5 +748,10 @@ } return annotations; } + + @Transient + public Study getStudy() { + return this; + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/PhyloTreeNode.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -24,6 +24,7 @@ import org.cipres.treebase.TreebaseUtil; import org.cipres.treebase.domain.AbstractPersistedObject; import org.cipres.treebase.domain.TBPersistable; +import org.cipres.treebase.domain.study.Study; import org.cipres.treebase.domain.taxon.TaxonLabel; /** @@ -606,4 +607,9 @@ return getTree(); } */ + + @Transient + public Study getStudy() { + return getTree().getStudy(); + } } Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/TreeBlock.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/TreeBlock.java 2012-01-11 17:02:42 UTC (rev 1013) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/tree/TreeBlock.java 2012-01-19 22:38:16 UTC (rev 1014) @@ -346,5 +346,10 @@ } return null; } + + @Transient + public Study getStudy() { + return getContext(); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |