James Moger
2014-06-16 6b18b0761b726fd9aef1ebcc21b760378f7d4b5c
src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java
New file
@@ -0,0 +1,199 @@
/*
 * Copyright 2014 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.wicket.panels;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Radio;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import com.gitblit.Constants.AccessRestrictionType;
import com.gitblit.Constants.AuthorizationControl;
import com.gitblit.Keys;
import com.gitblit.models.RepositoryModel;
import com.gitblit.wicket.WicketUtils;
/**
 * A radio group panel of the 5 available authorization/access restriction combinations.
 *
 * @author James Moger
 *
 */
public class AccessPolicyPanel extends BasePanel {
   private static final long serialVersionUID = 1L;
   private final RepositoryModel repository;
   private final AjaxFormChoiceComponentUpdatingBehavior callback;
   private RadioGroup<AccessPolicy> policiesGroup;
   private IModel<Boolean> allowForks;
   public AccessPolicyPanel(String wicketId, RepositoryModel repository) {
      this(wicketId, repository, null);
   }
   public AccessPolicyPanel(String wicketId, RepositoryModel repository, AjaxFormChoiceComponentUpdatingBehavior callback) {
      super(wicketId);
      this.repository = repository;
      this.callback = callback;
   }
   @Override
   protected void onInitialize() {
      super.onInitialize();
      AccessPolicy anonymousPolicy = new AccessPolicy(getString("gb.anonymousPolicy"),
            getString("gb.anonymousPolicyDescription"),
            "blank.png",
            AuthorizationControl.AUTHENTICATED,
            AccessRestrictionType.NONE);
      AccessPolicy authenticatedPushPolicy = new AccessPolicy(getString("gb.authenticatedPushPolicy"),
            getString("gb.authenticatedPushPolicyDescription"),
            "lock_go_16x16.png",
            AuthorizationControl.AUTHENTICATED,
            AccessRestrictionType.PUSH);
      AccessPolicy namedPushPolicy = new AccessPolicy(getString("gb.namedPushPolicy"),
            getString("gb.namedPushPolicyDescription"),
            "lock_go_16x16.png",
            AuthorizationControl.NAMED,
            AccessRestrictionType.PUSH);
      AccessPolicy clonePolicy = new AccessPolicy(getString("gb.clonePolicy"),
            getString("gb.clonePolicyDescription"),
            "lock_pull_16x16.png",
            AuthorizationControl.NAMED,
            AccessRestrictionType.CLONE);
      AccessPolicy viewPolicy = new AccessPolicy(getString("gb.viewPolicy"),
            getString("gb.viewPolicyDescription"),
            "shield_16x16.png",
            AuthorizationControl.NAMED,
            AccessRestrictionType.VIEW);
      List<AccessPolicy> policies = new ArrayList<AccessPolicy>();
      if (app().settings().getBoolean(Keys.git.allowAnonymousPushes, false)) {
         policies.add(anonymousPolicy);
      }
      policies.add(authenticatedPushPolicy);
      policies.add(namedPushPolicy);
      policies.add(clonePolicy);
      policies.add(viewPolicy);
      AccessRestrictionType defaultRestriction = repository.accessRestriction;
      if (defaultRestriction == null) {
         defaultRestriction = AccessRestrictionType.fromName(app().settings().getString(Keys.git.defaultAccessRestriction,
               AccessRestrictionType.PUSH.name()));
      }
      AuthorizationControl defaultControl = repository.authorizationControl;
      if (defaultControl == null) {
         defaultControl = AuthorizationControl.fromName(app().settings().getString(Keys.git.defaultAuthorizationControl,
               AuthorizationControl.NAMED.name()));
      }
      AccessPolicy defaultPolicy = namedPushPolicy;
      for (AccessPolicy policy : policies) {
         if (policy.type == defaultRestriction && policy.control == defaultControl) {
            defaultPolicy = policy;
         }
      }
      policiesGroup = new RadioGroup<>("policiesGroup", new Model<AccessPolicy>(defaultPolicy));
      ListView<AccessPolicy> policiesList = new ListView<AccessPolicy>("policies", policies) {
         private static final long serialVersionUID = 1L;
         @Override
         protected void populateItem(ListItem<AccessPolicy> item) {
            AccessPolicy p = item.getModelObject();
            item.add(new Radio<AccessPolicy>("radio", item.getModel()));
            item.add(WicketUtils.newImage("image",  p.image));
            item.add(new Label("name", p.name));
            item.add(new Label("description", p.description));
         }
      };
      policiesGroup.add(policiesList);
      if (callback != null) {
         policiesGroup.add(callback);
         policiesGroup.setOutputMarkupId(true);
      }
      add(policiesGroup);
      allowForks = Model.of(app().settings().getBoolean(Keys.web.allowForking, true));
      if (allowForks.getObject()) {
         Fragment fragment = new Fragment("allowForks", "allowForksFragment", this);
         fragment.add(new BooleanOption("allowForks",
            getString("gb.allowForks"),
            getString("gb.allowForksDescription"),
            allowForks));
         add(fragment);
      } else {
         add(new Label("allowForks").setVisible(false));
      }
      setOutputMarkupId(true);
   }
   public void updateModel(RepositoryModel repository) {
      AccessPolicy policy = policiesGroup.getModelObject();
      repository.authorizationControl = policy.control;
      repository.accessRestriction = policy.type;
      repository.allowForks = allowForks.getObject();
   }
   @Override
   protected boolean getStatelessHint() {
      return false;
   }
   public static class AccessPolicy implements Serializable {
      private static final long serialVersionUID = 1L;
      final String name;
      final String description;
      final String image;
      final AuthorizationControl control;
      final AccessRestrictionType type;
      AccessPolicy(String name, String description, String img, AuthorizationControl control, AccessRestrictionType type) {
         this.name = name;
         this.description = description;
         this.image = img;
         this.control = control;
         this.type = type;
      }
      @Override
      public String toString() {
         return name;
      }
   }
}