CompositeSkin(SkinService service, Collection<SkinConfig> skins) {
    TreeMap<String, SkinConfig> urlSkins = new TreeMap<String, SkinConfig>();
    for (SkinConfig skin : skins) {
      urlSkins.put(skin.getCSSPath(), skin);
    }

    //
    final StringBuilder builder = new StringBuilder();
    builder.append("/portal/resource");

    //
    final StringBuilder id = new StringBuilder();

    //
    try {
      for (SkinConfig cfg : urlSkins.values()) {
        StringBuilder encodedName = new StringBuilder();
        Codec.encode(encodedName, cfg.getName());
        StringBuilder encodedModule = new StringBuilder();
        Codec.encode(encodedModule, cfg.getModule());

        //
        id.append(encodedName).append(encodedModule);
        builder.append("/").append(encodedName).append("/").append(encodedModule);
      }
    } catch (IOException e) {
      throw new Error(e);
    }

    //
    this.service = service;
    this.id = id.toString();
    this.urlPrefix = builder.toString();
  }
 public Resource resolve(String path) {
   if (path.startsWith("/portal/resource/") && path.endsWith(".css")) {
     final StringBuffer sb = new StringBuffer();
     String encoded = path.substring("/portal/resource/".length());
     String blah[] = encoded.split("/");
     int len = (blah.length >> 1) << 1;
     for (int i = 0; i < len; i += 2) {
       String name = Codec.decode(blah[i]);
       String module = Codec.decode(blah[i + 1]);
       SkinKey key = new SkinKey(module, name);
       SkinConfig skin = skins.get(key);
       if (skin != null) {
         sb.append("@import url(").append(skin.getCSSPath()).append(");").append("\n");
       }
     }
     return new Resource(path) {
       @Override
       public Reader read() {
         return new StringReader(sb.toString());
       }
     };
   } else {
     return null;
   }
 }
  public void testDeployedSkinModules() {
    assertNotNull(skinService.getAvailableSkinNames());
    assertTrue(skinService.getAvailableSkinNames().contains("TestSkin"));

    Collection<SkinConfig> skinConfigs = skinService.getPortalSkins("TestSkin");
    assertNotNull(skinConfigs);

    SkinConfig portalSkin = null;
    for (SkinConfig config : skinConfigs) {
      if ("TestSkin".equals(config.getName())) {
        portalSkin = config;
        break;
      }
    }
    assertNotNull(portalSkin);
    assertEquals(
        mockServletContext.getContextPath() + "/skin/Stylesheet.css", portalSkin.getCSSPath());

    SkinConfig firstPortletSkin = skinService.getSkin("mockwebapp/FirstPortlet", "TestSkin");
    assertNotNull(firstPortletSkin);
    assertEquals(
        mockServletContext.getContextPath() + "/skin/portlet/FirstPortlet/Stylesheet.css",
        firstPortletSkin.getCSSPath());
  }