private String generateEmbeddedId(String embeddedType, IdAllocator idAllocator) {
    // Component types may be in folders; strip off the folder part for starters.

    int slashx = embeddedType.lastIndexOf("/");

    String baseId = embeddedType.substring(slashx + 1).toLowerCase();

    // The idAllocator is pre-loaded with all the component ids from the template, so even
    // if the lower-case type matches the id of an existing component, there won't be a name
    // collision.

    return idAllocator.allocateId(baseId);
  }
  /**
   * Do you smell something? I'm smelling that this class needs to be redesigned to not need a
   * central method this large and hard to test. I think a lot of instance and local variables need
   * to be bundled up into some kind of process object. This code is effectively too big to be
   * tested except through integration testing.
   */
  private void loadTemplateForComponent(final ComponentPageElement loadingElement) {
    this.loadingElement = loadingElement;
    loadingComponentModel = loadingElement.getComponentResources().getComponentModel();

    String componentClassName = loadingComponentModel.getComponentClassName();
    ComponentTemplate template = templateSource.getTemplate(loadingComponentModel, locale);

    // When the template for a component is missing, we pretend it consists of just a RenderBody
    // phase. Missing is not an error ... many component simply do not have a template.

    if (template.isMissing()) {
      this.loadingElement.addToTemplate(new RenderBodyElement(this.loadingElement));
      return;
    }

    // Pre-allocate ids to avoid later name collisions.

    // Don't have a case-insensitive Set, so we'll make due with a Map
    Map<String, Boolean> embeddedIds = collectedEmbeddedComponentIds(loadingComponentModel);

    idAllocator.clear();

    final Map<String, Location> componentIdsMap = template.getComponentIds();

    for (String id : componentIdsMap.keySet()) {
      idAllocator.allocateId(id);
      embeddedIds.remove(id);
    }

    if (!embeddedIds.isEmpty())
      throw new RuntimeException(
          ServicesMessages.embeddedComponentsNotInTemplate(
              embeddedIds.keySet(), componentClassName, template.getResource()));

    addAttributesAsComponentBindings = false;

    // The outermost elements of the template belong in the loading component's template list,
    // not its body list. This shunt allows everyone else to not have to make that decision,
    // they can add to the "body" and (if there isn't an active component), the shunt will
    // add the element to the component's template.

    BodyPageElement shunt =
        new BodyPageElement() {
          public void addToBody(PageElement element) {
            loadingElement.addToTemplate(element);
          }
        };

    bodyPageElementStack.push(shunt);

    for (TemplateToken token : template.getTokens()) {
      switch (token.getTokenType()) {
        case TEXT:
          text((TextToken) token);
          break;

        case EXPANSION:
          expansion((ExpansionToken) token);
          break;

        case BODY:
          body();
          break;

        case START_ELEMENT:
          startElement((StartElementToken) token);
          break;

        case START_COMPONENT:
          startComponent((StartComponentToken) token);
          break;

        case ATTRIBUTE:
          attribute((AttributeToken) token);
          break;

        case END_ELEMENT:
          endElement();
          break;

        case COMMENT:
          comment((CommentToken) token);
          break;

        case BLOCK:
          block((BlockToken) token);
          break;

        case PARAMETER:
          parameter((ParameterToken) token);
          break;

        case DTD:
          dtd((DTDToken) token);
          break;

        case DEFINE_NAMESPACE_PREFIX:
          defineNamespacePrefix((DefineNamespacePrefixToken) token);
          break;

        case CDATA:
          cdata((CDATAToken) token);
          break;

        default:
          throw new IllegalStateException("Not implemented yet: " + token);
      }
    }

    // For neatness / symmetry:

    bodyPageElementStack.pop(); // the shunt

    // TODO: Check that all stacks are empty. That should never happen, as long
    // as the ComponentTemplate is valid.
  }
  // Called for each page load of administration
  public void load() {

    /* In case plugin is uncheck */
    // List all jobs
    List<String> allJobsName = new ArrayList<String>();

    // List all the jobs that use the plugin (with at least one resource)
    List<String> allExclusionJobs = new ArrayList<String>();

    // Check all projects
    for (Project<?, ?> p : Hudson.getInstance().getProjects()) {

      // Add all jobs names to the list
      allJobsName.add(p.getName());
      // We want to retrieve all components BuildWrappers
      Map<Descriptor<BuildWrapper>, BuildWrapper> buildWrappers = p.getBuildWrappers();
      // For each of them
      for (Iterator i = buildWrappers.keySet().iterator(); i.hasNext(); ) {
        Descriptor<BuildWrapper> key = (Descriptor<BuildWrapper>) i.next();

        // We check if the descriptor is "org.jvnet.hudson.plugins.exclusion.IdAllocator $
        // DescriptorImpl"
        if (buildWrappers
            .get(key)
            .getDescriptor()
            .toString()
            .split("@")[0]
            .equals("org.jvnet.hudson.plugins.exclusion.IdAllocator$DescriptorImpl")) {
          // No duplicates
          if (!allExclusionJobs.contains(p.getName())) {
            allExclusionJobs.add(p.getName());
          }
        }
      }
    }

    // We delete each job that is in the global list and not in the list of exclusions
    for (String jobName : allJobsName) {
      if (!allExclusionJobs.contains(jobName)) {
        IdAllocator.deleteList(jobName);
      }
    }

    // Set all builds to false (build = currently used)
    for (RessourcesMonitor rm : listRessources) {
      rm.setBuild(false);
    }

    // For each resource Job, set build to true if a resource is used
    for (Iterator i = IdAllocationManager.ids.keySet().iterator(); i.hasNext(); ) {
      String resource = (String) i.next();
      IdAllocator.updateBuild(
          IdAllocationManager.ids.get(resource).getProject().getName(), resource, true);
    }

    list = new ArrayList<RessourcesMonitor>();
    // Local copy of the list
    for (RessourcesMonitor rm : listRessources) {
      list.add(new RessourcesMonitor(rm.getJobName(), rm.getRessource(), rm.getBuild()));
    }
  }
 public AdministrationPanel() {
   super();
   listRessources = IdAllocator.getListRessources();
 }