It sounds like there's widespread practices in our codebase that this new restriction might improve.
Instead of /** Constructs XX object */ you could add a @deprecated and/or a TODO to migrate the code. Kenn On Mon, Jan 28, 2019 at 11:46 PM Reuven Lax <re...@google.com> wrote: > The problem is existing code. I find that if I touch existing code that > has a constructor, I am then forced to add a Javadoc on the constructor. > Usually this Javadoc is "Constructs XX object." > > On Mon, Jan 28, 2019 at 5:07 PM Kenneth Knowles <k...@apache.org> wrote: > >> Half agree, half disagree >> >> Disagree: best practice is to make your constructors private and have >> distinct static methods for various modes of instantiation, which will then >> require Javadoc. >> >> Agree: once they are private no javadoc is needed :-) and there's often >> only one "most general" constructor that all the static methods use in >> different ways >> >> Kenn >> >> On Mon, Jan 28, 2019 at 5:03 PM Ruoyun Huang <ruo...@google.com> wrote: >> >>> Fair point. Looking at JavaDocMethod spec [1], unfortunately there is no >>> properties available for this tweak. >>> >>> Let me dig a bit more to see whether this can be done via suppression. >>> >>> [1] http://checkstyle.sourceforge.net/config_javadoc.html#JavadocMethod >>> >>> On Mon, Jan 28, 2019 at 4:36 PM Reuven Lax <re...@google.com> wrote: >>> >>>> This appears to be forcing us to set javadoc on constructors as well, >>>> which is usually pointless. Can we exclude constructor methods from this >>>> check? >>>> >>>> On Wed, Jan 23, 2019 at 5:40 PM Ruoyun Huang <ruo...@google.com> wrote: >>>> >>>>> Our recent change is on "JavaDocMethod", which not turned on yet. Not >>>>> relevant to this error here. >>>>> >>>>> The one throws error is "javaDocType". it has been there for a while >>>>> <https://github.com/apache/beam/blame/master/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml#L156>, >>>>> which is for public class javadoc missing. Yeah, I am curious as well why >>>>> preCommit didn't catch this one. >>>>> >>>>> >>>>> >>>>> On Wed, Jan 23, 2019 at 5:28 PM Alex Amato <ajam...@google.com> wrote: >>>>> >>>>>> Did their happen to be a short time window where some missing Javadoc >>>>>> comments went in? I am now seeing precommit fail due to code I didn't >>>>>> modify. >>>>>> >>>>>> >>>>>> https://scans.gradle.com/s/nwgb7xegklwqo/console-log?task=:beam-runners-direct-java:checkstyleMain >>>>>> >>>>>> >>>>>> >>>>>> On Wed, Jan 23, 2019 at 2:34 PM Ruoyun Huang <ruo...@google.com> >>>>>> wrote: >>>>>> >>>>>>> Trying to understand your suggestion. By saying "break that >>>>>>> dependency", do you mean moving checkstyle out of Java PreCommit? >>>>>>> >>>>>>> currently we do have checkstyle as part of ":check". It seems to >>>>>>> me "check" does minimal amount of essential works (correct me If I am >>>>>>> wrong), much less than what PreCommit does. >>>>>>> >>>>>>> On Wed, Jan 23, 2019 at 12:20 PM Kenneth Knowles <k...@apache.org> >>>>>>> wrote: >>>>>>> >>>>>>>> It is always a bummer when the Java PreCommit fails due to style >>>>>>>> checking. Can we get this to run separately and quicker? I notice it >>>>>>>> depends on compileJava. I cannot remember why that is, but I recall it >>>>>>>> is a >>>>>>>> legitimate reason. Nonetheless, can we break that dependency somehow? >>>>>>>> >>>>>>>> Kenn >>>>>>>> >>>>>>>> On Wed, Jan 16, 2019 at 6:42 PM Ruoyun Huang <ruo...@google.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi, everyone, >>>>>>>>> >>>>>>>>> >>>>>>>>> To make sure we move forward to a clean state where we catch >>>>>>>>> violations in any new PR, we created this change: >>>>>>>>> https://github.com/apache/beam/pull/7532 >>>>>>>>> >>>>>>>>> This PR makes checkstyle to report error on missing javadocs. For >>>>>>>>> existing violations, we explicitly added them as suppression rules, >>>>>>>>> down to >>>>>>>>> which line in the code. >>>>>>>>> >>>>>>>>> The caveat is, once this PR is merged, whoever make update to any >>>>>>>>> file in the list, will very likely have to fix the existing violation >>>>>>>>> for >>>>>>>>> that file. :-) Hope this sounds like a reasonable idea to move >>>>>>>>> forward. >>>>>>>>> >>>>>>>>> In the meanwhile, I will try to address the items in the list (if >>>>>>>>> I can). And over time, I will get back to this and remove those >>>>>>>>> suppressions no longer needed (created JIRA-6446 for tracking >>>>>>>>> purpose), until all of them are fixed. >>>>>>>>> >>>>>>>>> On Wed, Jan 9, 2019 at 10:57 PM Ruoyun Huang <ruo...@google.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> created a PR: https://github.com/apache/beam/pull/7454 >>>>>>>>>> >>>>>>>>>> Note instead of having separated checkstyle specs for Main versus >>>>>>>>>> Test, this PR simply uses suppression to turn off JavaDocComment for >>>>>>>>>> test >>>>>>>>>> files. >>>>>>>>>> >>>>>>>>>> If this PR draft looks good, then next step I will commit another >>>>>>>>>> change that: >>>>>>>>>> 1) throw error on violations (now just warning to keep PR green). >>>>>>>>>> 2) List all the violations explicitly in a suppression list, and >>>>>>>>>> let area contributors/owners address and chop things off the list >>>>>>>>>> over >>>>>>>>>> time. Not ideal and quite some manual work, if there is a better >>>>>>>>>> way, >>>>>>>>>> please let me know. >>>>>>>>>> >>>>>>>>>> On Wed, Jan 9, 2019 at 7:29 AM Robert Bradshaw < >>>>>>>>>> rober...@google.com> wrote: >>>>>>>>>> >>>>>>>>>>> On Tue, Jan 8, 2019 at 11:15 PM Kenneth Knowles <k...@apache.org> >>>>>>>>>>> wrote: >>>>>>>>>>> > >>>>>>>>>>> > I think @Internal would be a reasonable annotation to exempt >>>>>>>>>>> from documentation, as that means it is explicitly *not* part of >>>>>>>>>>> the actual >>>>>>>>>>> public API, as Ismaël alluded to. >>>>>>>>>>> >>>>>>>>>>> We'll probably want a distinct annotation from that. Forced >>>>>>>>>>> comments, >>>>>>>>>>> especially forced-by-an-impartial-metric ones, are often lower >>>>>>>>>>> quality. This is the kind of signal that would be useful to >>>>>>>>>>> surface to >>>>>>>>>>> a reviewer who could then (jointly) make the call rather than it >>>>>>>>>>> being >>>>>>>>>>> a binary failure/success. >>>>>>>>>>> >>>>>>>>>>> > (I'm still on the docs-on-private-too side of things, but >>>>>>>>>>> realize that's an extreme position) >>>>>>>>>>> >>>>>>>>>>> +1 to docs on private things as well, though maybe with not as >>>>>>>>>>> high priority :). >>>>>>>>>>> >>>>>>>>>>> > It is a shame that we chose blacklist (via @Internal) instead >>>>>>>>>>> of whitelist (via e.g. @Public) for what constitutes an actual >>>>>>>>>>> supported >>>>>>>>>>> public method. >>>>>>>>>>> >>>>>>>>>>> Probably better than having to re-train others that public >>>>>>>>>>> doesn't >>>>>>>>>>> really mean public unless it has a @Public on it. It's harder to >>>>>>>>>>> "unknowingly" use an @Internal API. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> > Kenn >>>>>>>>>>> > >>>>>>>>>>> > On Tue, Jan 8, 2019 at 1:46 PM Ruoyun Huang <ruo...@google.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >> >>>>>>>>>>> >> To Ismael's question: When applying such a check (i.e. >>>>>>>>>>> public method with >30 Loc), our code base shows in total 115 >>>>>>>>>>> violations. >>>>>>>>>>> >> >>>>>>>>>>> >> Thanks for the feedback everyone. As some of you mentioned >>>>>>>>>>> already, suppress warning is always available whenever >>>>>>>>>>> contributor/reviewer >>>>>>>>>>> feels appropriate, instead of been forced to put in low quality >>>>>>>>>>> comments. >>>>>>>>>>> This check is more about to help us avoid human errors, in those >>>>>>>>>>> cases we >>>>>>>>>>> do want to add meaningful javadocs. >>>>>>>>>>> >> >>>>>>>>>>> >> With 5 +1s so far. I will put together a PR draft. A bit >>>>>>>>>>> research is still needed regarding the best practise to apply check >>>>>>>>>>> to >>>>>>>>>>> Main/Test in a different way. If anyone has experience on it, >>>>>>>>>>> please share >>>>>>>>>>> it with me. >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> On Tue, Jan 8, 2019 at 8:19 AM Ismaël Mejía < >>>>>>>>>>> ieme...@gmail.com> wrote: >>>>>>>>>>> >>> >>>>>>>>>>> >>> -0 >>>>>>>>>>> >>> >>>>>>>>>>> >>> Same comments than Robert I am particularly worried on how >>>>>>>>>>> this affect >>>>>>>>>>> >>> contributors in particular casual ones. Even if the intended >>>>>>>>>>> idea is >>>>>>>>>>> >>> good I am also worried that people just write poor comments >>>>>>>>>>> to get rid >>>>>>>>>>> >>> of the annoyance. >>>>>>>>>>> >>> >>>>>>>>>>> >>> Have you already estimated how hard is the current codebase >>>>>>>>>>> impacted? >>>>>>>>>>> >>> Or how many methods will be needed to document before this >>>>>>>>>>> gets in >>>>>>>>>>> >>> place? >>>>>>>>>>> >>> >>>>>>>>>>> >>> I wouldn't be surprised if many runners or internal parts of >>>>>>>>>>> the >>>>>>>>>>> >>> codebase lack comments on public methods considering that >>>>>>>>>>> the 'public >>>>>>>>>>> >>> API' of must runners 'is not' the public methods but the >>>>>>>>>>> specific >>>>>>>>>>> >>> PipelineOptions, and for some methods (even longer ones) >>>>>>>>>>> such comments >>>>>>>>>>> >>> may be trivial. >>>>>>>>>>> >>> >>>>>>>>>>> >>> On Tue, Jan 8, 2019 at 5:16 PM Kenneth Knowles < >>>>>>>>>>> k...@apache.org> wrote: >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > +1 I even thought this was already on (at some point). >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > On Tue, Jan 8, 2019 at 8:01 AM Scott Wegner < >>>>>>>>>>> sc...@apache.org> wrote: >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> I would even propose applying this to non-public methods, >>>>>>>>>>> but I suspect that would be more controversial. >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > I also would support this. It will improve code quality as >>>>>>>>>>> well. Often missing doc means something is not well thought-out. It >>>>>>>>>>> often >>>>>>>>>>> also indicates a misguided attempt to "share code" without sharing >>>>>>>>>>> a clear >>>>>>>>>>> concept. >>>>>>>>>>> >>> > >>>>>>>>>>> >>> >> I share Robert's concern for random victims hitting the >>>>>>>>>>> policy when a method grows from N-1 to N lines. This can easily >>>>>>>>>>> happen with >>>>>>>>>>> automatic refactoring + spotless code formatting. For example, >>>>>>>>>>> renaming a >>>>>>>>>>> variable to a longer name can introduce new line-breaks. But, I'm >>>>>>>>>>> think >>>>>>>>>>> code documentation is valuable enough that it's still worth it. >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > Another perspective is that someone is getting away with >>>>>>>>>>> missing documentation at N-1. Seems OK. But maybe just >>>>>>>>>>> allowMissingPropertyJavadoc (from >>>>>>>>>>> http://checkstyle.sourceforge.net/config_javadoc.html#JavadocMethod)? >>>>>>>>>>> We can also configure allowedAnnotations but if you are going to go >>>>>>>>>>> through >>>>>>>>>>> the trouble of annotating something, a javadoc comment is just as >>>>>>>>>>> easy. >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > I want to caveat this: I am strongly opposed to any >>>>>>>>>>> requirements on the contents of the javadoc, which is almost all >>>>>>>>>>> the time >>>>>>>>>>> redundant bloat if the description is at all adequate. >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > Kenn >>>>>>>>>>> >>> > >>>>>>>>>>> >>> > >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> On Tue, Jan 8, 2019 at 4:03 AM Robert Bradshaw < >>>>>>>>>>> rober...@google.com> wrote: >>>>>>>>>>> >>> >>> >>>>>>>>>>> >>> >>> With the clarification that we're looking at the >>>>>>>>>>> intersection of >>>>>>>>>>> >>> >>> public + "big", I think this is a great idea. We should >>>>>>>>>>> make it clear >>>>>>>>>>> >>> >>> that this is a lower bar--many private or shorter >>>>>>>>>>> methods merit >>>>>>>>>>> >>> >>> documentation as well (but that's harder to >>>>>>>>>>> automatically detect). The >>>>>>>>>>> >>> >>> one difficulty with a threshold is that it's painful for >>>>>>>>>>> the person >>>>>>>>>>> >>> >>> who does some refactoring or other minor work and turns >>>>>>>>>>> the (say) >>>>>>>>>>> >>> >>> 29-line method into a 30-line one. This is a case where >>>>>>>>>>> as suppression >>>>>>>>>>> >>> >>> annotation (appropriately used) could be useful. >>>>>>>>>>> >>> >>> >>>>>>>>>>> >>> >>> On Tue, Jan 8, 2019 at 1:49 AM Daniel Oliveira < >>>>>>>>>>> danolive...@google.com> wrote: >>>>>>>>>>> >>> >>> > >>>>>>>>>>> >>> >>> > +1 >>>>>>>>>>> >>> >>> > >>>>>>>>>>> >>> >>> > I like this idea, especially with the line number >>>>>>>>>>> requirement. The exact number of lines is debatable, but you could >>>>>>>>>>> go as >>>>>>>>>>> low as 10 lines and that would exclude any trivial setters and >>>>>>>>>>> getters. >>>>>>>>>>> Even better might be if it's possible to configure checkstyle to >>>>>>>>>>> ignore >>>>>>>>>>> this for getters and setters (I don't know if checkstyle supports >>>>>>>>>>> this, but >>>>>>>>>>> I know that other tools are able to auto-detect getters and >>>>>>>>>>> setters). >>>>>>>>>>> >>> >>> > >>>>>>>>>>> >>> >>> > I'm not dead-set against having annotation to suppress >>>>>>>>>>> the comment, but it carries the risk that code will be left >>>>>>>>>>> un-commented >>>>>>>>>>> because both the dev and reviewer think it's self-explanatory, and >>>>>>>>>>> then >>>>>>>>>>> someone new to the codebase finds it confusing. >>>>>>>>>>> >>> >>> > >>>>>>>>>>> >>> >>> > On Mon, Jan 7, 2019 at 11:31 AM Ankur Goenka < >>>>>>>>>>> goe...@google.com> wrote: >>>>>>>>>>> >>> >>> >> >>>>>>>>>>> >>> >>> >> I think it makes sense. >>>>>>>>>>> >>> >>> >> Having an annotation to suppress this check for a >>>>>>>>>>> method/class instead of adding trivial comment would be useful. >>>>>>>>>>> >>> >>> >> >>>>>>>>>>> >>> >>> >> On Mon, Jan 7, 2019 at 9:53 AM Ruoyun Huang < >>>>>>>>>>> ruo...@google.com> wrote: >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> Yeah. Agree there is no reason to enforce anything >>>>>>>>>>> for trivial methods like setter/getter. >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> What I meant is to enforce only for a method that is >>>>>>>>>>> BOTH 1) public method 2) has longer than N lines. >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> sorry for not making the proposal clear enough in >>>>>>>>>>> the original message, it should've better titled "enforce ... on >>>>>>>>>>> non-trivial public methods". >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> On Mon, Jan 7, 2019 at 1:31 AM Robert Bradshaw < >>>>>>>>>>> rober...@google.com> wrote: >>>>>>>>>>> >>> >>> >>>> >>>>>>>>>>> >>> >>> >>>> IMHO, requiring comments on trivial methods like >>>>>>>>>>> setters and getters >>>>>>>>>>> >>> >>> >>>> is often a net negative, but setting some standard >>>>>>>>>>> could be useful. >>>>>>>>>>> >>> >>> >>>> >>>>>>>>>>> >>> >>> >>>> On Mon, Jan 7, 2019 at 7:35 AM Jean-Baptiste Onofré >>>>>>>>>>> <j...@nanthrax.net> wrote: >>>>>>>>>>> >>> >>> >>>> > >>>>>>>>>>> >>> >>> >>>> > Hi, >>>>>>>>>>> >>> >>> >>>> > >>>>>>>>>>> >>> >>> >>>> > for the presence of a comment on public method, >>>>>>>>>>> it's a good idea. Now, >>>>>>>>>>> >>> >>> >>>> > about the number of lines, not sure it's a good >>>>>>>>>>> idea. I'm thinking about >>>>>>>>>>> >>> >>> >>>> > the getter/setter which are public. Most of the >>>>>>>>>>> time, the comment is >>>>>>>>>>> >>> >>> >>>> > pretty simple (and useless ;)). >>>>>>>>>>> >>> >>> >>>> > >>>>>>>>>>> >>> >>> >>>> > Regards >>>>>>>>>>> >>> >>> >>>> > JB >>>>>>>>>>> >>> >>> >>>> > >>>>>>>>>>> >>> >>> >>>> > On 07/01/2019 04:35, Ruoyun Huang wrote: >>>>>>>>>>> >>> >>> >>>> > > Hi, everyone, >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > We were wondering whether it is a good idea >>>>>>>>>>> to make checkstyle >>>>>>>>>>> >>> >>> >>>> > > enforce public method comments. Our current >>>>>>>>>>> behavior of JavaDoc check is: >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > 1. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > Missing Class javadoc comment is reported >>>>>>>>>>> as error. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > 2. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > Method comment missing is explicitly >>>>>>>>>>> allowed. see [1]. It is not >>>>>>>>>>> >>> >>> >>>> > > even shown as warning. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > 3. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > The actual javadoc target gives warning >>>>>>>>>>> when certain tags are >>>>>>>>>>> >>> >>> >>>> > > missing in javadoc, but not if the whole >>>>>>>>>>> comment is missing. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > How about we enforce method comments for >>>>>>>>>>> **1) public method and 2) >>>>>>>>>>> >>> >>> >>>> > > method that is longer than N lines**. (N=~30 >>>>>>>>>>> seems a good number, >>>>>>>>>>> >>> >>> >>>> > > leading to ~50 violations in current >>>>>>>>>>> repository). I can find out the >>>>>>>>>>> >>> >>> >>>> > > corresponding contributors to fill in the >>>>>>>>>>> missing comments, before we >>>>>>>>>>> >>> >>> >>>> > > turning the check fully on. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > One caveat though is that we might want skip >>>>>>>>>>> this check on test code, >>>>>>>>>>> >>> >>> >>>> > > but I am not sure yet if our current setup can >>>>>>>>>>> easily handle separated >>>>>>>>>>> >>> >>> >>>> > > rules for main code versus test code. >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > Is this a good idea? Thoughts and >>>>>>>>>>> suggestions? >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > [1] >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> https://github.com/apache/beam/blame/5ceffb246c0c38ad68dd208e951a1f39c90ef85c/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml#L111 >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > > Cheers, >>>>>>>>>>> >>> >>> >>>> > > >>>>>>>>>>> >>> >>> >>>> > >>>>>>>>>>> >>> >>> >>>> > -- >>>>>>>>>>> >>> >>> >>>> > Jean-Baptiste Onofré >>>>>>>>>>> >>> >>> >>>> > jbono...@apache.org >>>>>>>>>>> >>> >>> >>>> > http://blog.nanthrax.net >>>>>>>>>>> >>> >>> >>>> > Talend - http://www.talend.com >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >>> >>> -- >>>>>>>>>>> >>> >>> >>> ================ >>>>>>>>>>> >>> >>> >>> Ruoyun Huang >>>>>>>>>>> >>> >>> >>> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> -- >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> >>>>>>>>>>> >>> >> Got feedback? tinyurl.com/swegner-feedback >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> -- >>>>>>>>>>> >> ================ >>>>>>>>>>> >> Ruoyun Huang >>>>>>>>>>> >> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> ================ >>>>>>>>>> Ruoyun Huang >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> ================ >>>>>>>>> Ruoyun Huang >>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> ================ >>>>>>> Ruoyun Huang >>>>>>> >>>>>>> >>>>> >>>>> -- >>>>> ================ >>>>> Ruoyun Huang >>>>> >>>>> >>> >>> -- >>> ================ >>> Ruoyun Huang >>> >>>