Fabrice Bacchella
2015-06-03 b57b9ec3edd2ca7e7e44190f85e3743cea822e3e
First draft for a customized avatar image
3 files added
2 files renamed
16 files modified
253 ■■■■ changed files
src/main/distrib/data/defaults.properties 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/AvatarGenerator.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/GravatarGenerator.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/GitBlitWebApp.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/GitblitWicketApp.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/CommitPage.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/ForksPage.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/RootPage.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/TagPage.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/TicketPage.java 12 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ActivityPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/AvatarImage.html patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/AvatarImage.java 21 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/CommitHeaderPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/DigestsPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ReflogPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/TicketListPanel.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/UserTitlePanel.java 2 ●●● patch | view | raw | blame | history
src/test/java/com/gitblit/tests/GravatarTest.java 77 ●●●●● patch | view | raw | blame | history
src/main/distrib/data/defaults.properties
@@ -975,6 +975,13 @@
# SINCE 0.8.0
web.allowGravatar = true
# Define which class will generate the avatar URL.
# This class must inherit from com.gitblit.AvatarGenerator
# It must use a no argument constructor
#
# SINCE 1.7.0
web.avatarClass = com.gitblit.GravatarGenerator
# Allow dynamic zip downloads.
#
# SINCE 0.5.0   
src/main/java/com/gitblit/AvatarGenerator.java
New file
@@ -0,0 +1,32 @@
/*
 * Copyright 2015 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit;
public abstract class AvatarGenerator {
    public abstract String getURL(String username, String emailaddress, boolean identicon, int width);
    /**
     * A method that can extract custom settings for the avatar generator
     * The default does nothing, it can be overridden
     *
     * @param settings
     */
    public void configure(IStoredSettings settings) {
    }
}
src/main/java/com/gitblit/GravatarGenerator.java
New file
@@ -0,0 +1,32 @@
/*
 * Copyright 2015 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit;
import com.gitblit.utils.ActivityUtils;
public class GravatarGenerator extends AvatarGenerator {
    public String getURL(String username, String emailaddress,
            boolean identicon, int width) {
        String email = emailaddress == null ? username.toLowerCase() : emailaddress.toLowerCase();
        if (identicon) {
            return ActivityUtils.getGravatarIdenticonUrl(email, width);
        } else {
            return ActivityUtils.getGravatarThumbnailUrl(email, width);
        }
    }
}
src/main/java/com/gitblit/wicket/GitBlitWebApp.java
@@ -32,6 +32,7 @@
import ro.fortsoft.pf4j.PluginState;
import ro.fortsoft.pf4j.PluginWrapper;
import com.gitblit.AvatarGenerator;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.extensions.GitblitWicketPlugin;
@@ -250,12 +251,15 @@
            }
        }
         // customize the Wicket class resolver to load from plugins
        // customize the Wicket class resolver to load from plugins
        IClassResolver coreResolver = getApplicationSettings().getClassResolver();
        PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
        getApplicationSettings().setClassResolver(classResolver);
        PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
        getApplicationSettings().setClassResolver(classResolver);
        getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
        buildAvatarGenerator();
    }
    /* (non-Javadoc)
@@ -476,4 +480,30 @@
    public static GitBlitWebApp get() {
        return (GitBlitWebApp) WebApplication.get();
    }
    AvatarGenerator generator = null;
    @SuppressWarnings("unchecked")
    private void buildAvatarGenerator() {
        Class<AvatarGenerator> clazz;
        try {
            clazz = (Class<AvatarGenerator>) getClass().getClassLoader().loadClass(settings.getString(Keys.web.avatarClass, "com.gitblit.GravatarGenerator"));
            generator = clazz.newInstance();
            generator.configure(settings);
        } catch (ClassNotFoundException | SecurityException | InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    public String buildAvatarUrl(String username, String emailaddress, String cssClass, int width, boolean identicon) {
        if (width <= 0) {
            width = 50;
        }
        if(generator != null) {
            return (String) generator.getURL(username, emailaddress, identicon, width);
        }
        return null;
    }
}
src/main/java/com/gitblit/wicket/GitblitWicketApp.java
@@ -75,4 +75,6 @@
    public abstract TimeZone getTimezone();
    public String buildAvatarUrl(String username, String emailaddress, String cssClass, int width, boolean identicon);
}
src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -47,7 +47,7 @@
import com.gitblit.wicket.panels.CommitHeaderPanel;
import com.gitblit.wicket.panels.CommitLegendPanel;
import com.gitblit.wicket.panels.DiffStatPanel;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.RefsPanel;
@@ -116,7 +116,7 @@
                item.add(new RefsPanel("refName", repositoryName, Arrays.asList(entry.notesRef)));
                item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(),
                        Constants.SearchType.AUTHOR));
                item.add(new GravatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent()));
                item.add(new AvatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent()));
                item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef
                        .getAuthorIdent().getWhen(), getTimeZone(), getTimeUtils()));
                item.add(new Label("noteContent", bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName,
src/main/java/com/gitblit/wicket/pages/CommitPage.java
@@ -44,7 +44,7 @@
import com.gitblit.wicket.panels.CommitLegendPanel;
import com.gitblit.wicket.panels.CompressedDownloadsPanel;
import com.gitblit.wicket.panels.DiffStatPanel;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.RefsPanel;
@@ -133,7 +133,7 @@
                item.add(new RefsPanel("refName", repositoryName, Arrays.asList(entry.notesRef)));
                item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(),
                        Constants.SearchType.AUTHOR));
                item.add(new GravatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent()));
                item.add(new AvatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent()));
                item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef
                        .getAuthorIdent().getWhen(), getTimeZone(), getTimeUtils()));
                item.add(new Label("noteContent", bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName,
src/main/java/com/gitblit/wicket/pages/ForksPage.java
@@ -34,7 +34,7 @@
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.LinkPanel;
public class ForksPage extends RepositoryPage {
@@ -63,7 +63,7 @@
                        user = new UserModel(repository.projectPath.substring(1));
                    }
                    PersonIdent ident = new PersonIdent(user.getDisplayName(), user.emailAddress == null ? user.getDisplayName() : user.emailAddress);
                    item.add(new GravatarImage("anAvatar", ident, 20));
                    item.add(new AvatarImage("anAvatar", ident, 20));
                    if (pageRepository.equals(repository)) {
                        // do not link to self
                        item.add(new Label("aProject", user.getDisplayName()));
src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -73,7 +73,7 @@
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.SessionlessForm;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.NavigationPanel;
@@ -612,7 +612,7 @@
            boolean standardLogin = authenticationType.isStandard();
            if (app().settings().getBoolean(Keys.web.allowGravatar, true)) {
                add(new GravatarImage("username", user, "navbarGravatar", 20, false));
                add(new AvatarImage("username", user, "navbarGravatar", 20, false));
            } else {
                add(new Label("username", user.getDisplayName()));
            }
src/main/java/com/gitblit/wicket/pages/TagPage.java
@@ -31,7 +31,7 @@
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.RefsPanel;
@@ -77,7 +77,7 @@
            linkClass = CommitPage.class;
            break;
        }
        add(new GravatarImage("taggerAvatar", tagRef.getAuthorIdent()));
        add(new AvatarImage("taggerAvatar", tagRef.getAuthorIdent()));
        add(new RefsPanel("tagName", repositoryName, Arrays.asList(tagRef)));
        add(new Label("tagId", tagRef.getObjectId().getName()));
src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -91,7 +91,7 @@
import com.gitblit.wicket.panels.BasePanel.JavascriptTextPrompt;
import com.gitblit.wicket.panels.CommentPanel;
import com.gitblit.wicket.panels.DiffStatPanel;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.IconAjaxLink;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.ShockWaveComponent;
@@ -312,7 +312,7 @@
                    if (user == null) {
                        user = new UserModel(username);
                    }
                    item.add(new GravatarImage("participant", user.getDisplayName(),
                    item.add(new AvatarImage("participant", user.getDisplayName(),
                            user.emailAddress, null, 25, true));
                }
            };
@@ -736,7 +736,7 @@
        } else {
            // permit user to comment
            Fragment newComment = new Fragment("newComment", "newCommentFragment", this);
            GravatarImage img = new GravatarImage("newCommentAvatar", user.username, user.emailAddress,
            AvatarImage img = new AvatarImage("newCommentAvatar", user.username, user.emailAddress,
                    "gravatar-round", avatarWidth, true);
            newComment.add(img);
            CommentPanel commentPanel = new CommentPanel("commentPanel", user, ticket, null, TicketsPage.class);
@@ -816,7 +816,7 @@
                public void populateItem(final Item<RevCommit> item) {
                    RevCommit commit = item.getModelObject();
                    PersonIdent author = commit.getAuthorIdent();
                    item.add(new GravatarImage("authorAvatar", author.getName(), author.getEmailAddress(), null, 16, false));
                    item.add(new AvatarImage("authorAvatar", author.getName(), author.getEmailAddress(), null, 16, false));
                    item.add(new Label("author", commit.getAuthorIdent().getName()));
                    item.add(new LinkPanel("commitId", null, getShortObjectId(commit.getName()),
                            CommitPage.class, WicketUtils.newObjectParameter(repositoryName, commit.getName()), true));
@@ -987,12 +987,12 @@
        UserModel commenter = app().users().getUserModel(entry.author);
        if (commenter == null) {
            // unknown user
            container.add(new GravatarImage("changeAvatar", entry.author,
            container.add(new AvatarImage("changeAvatar", entry.author,
                    entry.author, null, avatarSize, false).setVisible(avatarSize > 0));
            container.add(new Label("changeAuthor", entry.author.toLowerCase()));
        } else {
            // known user
            container.add(new GravatarImage("changeAvatar", commenter.getDisplayName(),
            container.add(new AvatarImage("changeAvatar", commenter.getDisplayName(),
                    commenter.emailAddress, avatarSize > 24 ? "gravatar-round" : null,
                            avatarSize, true).setVisible(avatarSize > 0));
            container.add(new LinkPanel("changeAuthor", null, commenter.getDisplayName(),
src/main/java/com/gitblit/wicket/panels/ActivityPanel.java
@@ -76,7 +76,7 @@
                                .getWhen(), getTimeZone(), getTimeUtils()));
                        // avatar
                        commitItem.add(new GravatarImage("avatar", commit.getAuthorIdent(), 40));
                        commitItem.add(new AvatarImage("avatar", commit.getAuthorIdent(), 40));
                        // merge icon
                        if (commit.getParentCount() > 1) {
src/main/java/com/gitblit/wicket/panels/AvatarImage.html
src/main/java/com/gitblit/wicket/panels/AvatarImage.java
File was renamed from src/main/java/com/gitblit/wicket/panels/GravatarImage.java
@@ -19,7 +19,6 @@
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.wicket.ExternalImage;
import com.gitblit.wicket.WicketUtils;
@@ -29,36 +28,30 @@
 * @author James Moger
 *
 */
public class GravatarImage extends BasePanel {
public class AvatarImage extends BasePanel {
    private static final long serialVersionUID = 1L;
    public GravatarImage(String id, PersonIdent person) {
    public AvatarImage(String id, PersonIdent person) {
        this(id, person, 0);
    }
    public GravatarImage(String id, PersonIdent person, int width) {
    public AvatarImage(String id, PersonIdent person, int width) {
        this(id, person.getName(), person.getEmailAddress(), "gravatar", width, true);
    }
    public GravatarImage(String id, PersonIdent person, String cssClass, int width, boolean identicon) {
    public AvatarImage(String id, PersonIdent person, String cssClass, int width, boolean identicon) {
        this(id, person.getName(), person.getEmailAddress(), cssClass, width, identicon);
    }
    public GravatarImage(String id, UserModel user, String cssClass, int width, boolean identicon) {
    public AvatarImage(String id, UserModel user, String cssClass, int width, boolean identicon) {
        this(id, user.getDisplayName(), user.emailAddress, cssClass, width, identicon);
    }
    public GravatarImage(String id, String username, String emailaddress, String cssClass, int width, boolean identicon) {
    public AvatarImage(String id, String username, String emailaddress, String cssClass, int width, boolean identicon) {
        super(id);
        String email = emailaddress == null ? username.toLowerCase() : emailaddress.toLowerCase();
        String url;
        if (identicon) {
            url = ActivityUtils.getGravatarIdenticonUrl(email, width);
        } else {
            url = ActivityUtils.getGravatarThumbnailUrl(email, width);
        }
        String url = app().buildAvatarUrl(username, emailaddress, cssClass, width, identicon);
        ExternalImage image = new ExternalImage("image", url);
        if (cssClass != null) {
            WicketUtils.setCssClass(image, cssClass);
src/main/java/com/gitblit/wicket/panels/CommitHeaderPanel.java
@@ -44,6 +44,6 @@
        add(new Label("commitid", c.getName()));
        add(new Label("author", c.getAuthorIdent().getName()));
        add(WicketUtils.createDateLabel("date", c.getAuthorIdent().getWhen(), getTimeZone(), getTimeUtils()));
        add(new GravatarImage("authorAvatar", c.getAuthorIdent()));
        add(new AvatarImage("authorAvatar", c.getAuthorIdent()));
    }
}
src/main/java/com/gitblit/wicket/panels/DigestsPanel.java
@@ -216,7 +216,7 @@
                        final RepositoryCommit commit = commitItem.getModelObject();
                        // author gravatar
                        commitItem.add(new GravatarImage("commitAuthor", commit.getAuthorIdent(), null, 16, false));
                        commitItem.add(new AvatarImage("commitAuthor", commit.getAuthorIdent(), null, 16, false));
                        // merge icon
                        if (commit.getParentCount() > 1) {
src/main/java/com/gitblit/wicket/panels/ReflogPanel.java
@@ -271,7 +271,7 @@
                        final RepositoryCommit commit = commitItem.getModelObject();
                        // author gravatar
                        commitItem.add(new GravatarImage("commitAuthor", commit.getAuthorIdent(), null, 16, false));
                        commitItem.add(new AvatarImage("commitAuthor", commit.getAuthorIdent(), null, 16, false));
                        // merge icon
                        if (commit.getParentCount() > 1) {
src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
@@ -145,7 +145,7 @@
                    }
                    Fragment userFragment = new Fragment("registrant", "userRegistrant", RegistrantPermissionsPanel.this);
                    userFragment.add(new GravatarImage("userAvatar", ident, 20));
                    userFragment.add(new AvatarImage("userAvatar", ident, 20));
                    userFragment.add(new Label("userName", entry.registrant));
                    item.add(userFragment);
                } else {
src/main/java/com/gitblit/wicket/panels/TicketListPanel.java
@@ -156,7 +156,7 @@
                    if (responsible == null) {
                        responsible = new UserModel(ticket.responsible);
                    }
                    GravatarImage avatar = new GravatarImage("responsible", responsible.getDisplayName(),
                    AvatarImage avatar = new AvatarImage("responsible", responsible.getDisplayName(),
                            responsible.emailAddress, null, 16, true);
                    avatar.setTooltip(getString("gb.responsible") + ": " + responsible.getDisplayName());
                    item.add(avatar);
src/main/java/com/gitblit/wicket/panels/UserTitlePanel.java
@@ -25,7 +25,7 @@
    public UserTitlePanel(String wicketId, UserModel user, String title) {
        super(wicketId);
        add(new GravatarImage("userGravatar", user, "gravatar", 36, false));
        add(new AvatarImage("userGravatar", user, "gravatar", 36, false));
        add(new Label("userDisplayName", user.getDisplayName()));
        add(new Label("userTitle", title));
    }
src/test/java/com/gitblit/tests/GravatarTest.java
New file
@@ -0,0 +1,77 @@
package com.gitblit.tests;
import org.junit.Assert;
import org.junit.Test;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.manager.AuthenticationManager;
import com.gitblit.manager.FederationManager;
import com.gitblit.manager.GitblitManager;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IPluginManager;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IServicesManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.manager.NotificationManager;
import com.gitblit.manager.PluginManager;
import com.gitblit.manager.ProjectManager;
import com.gitblit.manager.RepositoryManager;
import com.gitblit.manager.RuntimeManager;
import com.gitblit.manager.ServicesManager;
import com.gitblit.manager.UserManager;
import com.gitblit.tests.mock.MemorySettings;
import com.gitblit.tickets.FileTicketService;
import com.gitblit.tickets.ITicketService;
import com.gitblit.transport.ssh.IPublicKeyManager;
import com.gitblit.transport.ssh.MemoryKeyManager;
import com.gitblit.utils.IdGenerator;
import com.gitblit.utils.WorkQueue;
import com.gitblit.utils.XssFilter;
import com.gitblit.utils.XssFilter.AllowXssFilter;
import com.gitblit.wicket.GitBlitWebApp;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class GravatarTest extends GitblitUnitTest {
    public static  class SomeModule extends AbstractModule {
        private final IStoredSettings settings = new MemorySettings();
        SomeModule() {
            settings.overrideSetting(Keys.web.avatarClass, "com.gitblit.GravatarGenerator");
        }
        @Override
        protected void configure() {
            bind(IGitblit.class).to(GitblitManager.class);
            bind(IAuthenticationManager.class).to(AuthenticationManager.class);
            bind(IFederationManager.class).to(FederationManager.class);
            bind(INotificationManager.class).to(NotificationManager.class);
            bind(IPluginManager.class).to(PluginManager.class);
            bind(IRepositoryManager.class).to(RepositoryManager.class);
            bind(IProjectManager.class).to(ProjectManager.class);
            bind(IRuntimeManager.class).to(RuntimeManager.class);
            bind(IUserManager.class).to(UserManager.class);
            bind(ITicketService.class).to(FileTicketService.class);
            bind(XssFilter.class).to(AllowXssFilter.class);
            bind(IStoredSettings.class).toInstance(settings);
            bind(IPublicKeyManager.class).to(MemoryKeyManager.class);
            bind(IServicesManager.class).to(ServicesManager.class);
            bind(WorkQueue.class).toInstance(new WorkQueue(new IdGenerator(), 0));
        }
    }
    @Test
    public void oneTest() {
        Injector injector = Guice.createInjector(new SomeModule());
        GitBlitWebApp webapp = injector.getInstance(GitBlitWebApp.class);
        webapp.init();
        Assert.assertNotNull(webapp.buildAvatarUrl("username", "emailaddress", "cssClass", 10, true));
    }
}