/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.env.deploy;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* The generator for the deploy
*/
class ExpandVersionManager
{
private final String _id;
private final boolean _isVersioning;
private final TreeMap<String,ExpandVersion> _versionMap;
private final TreeMap<String,ExpandVersionGroup> _baseVersionMap;
/**
* Creates the deploy.
*/
public ExpandVersionManager(String id,
TreeSet<String> keySet,
boolean isVersioning)
{
_id = id;
_isVersioning = isVersioning;
_versionMap = buildVersionMap(keySet);
_baseVersionMap = buildVersionGroupMap(_versionMap);
}
/**
* Returns the version by the full key.
*/
public ExpandVersion getVersion(String key)
{
if (key != null)
return _versionMap.get(key);
else
return null;
}
/**
* Returns the version group by the base key.
*/
public ExpandVersionGroup getBaseVersionGroup(String baseKey)
{
if (baseKey != null)
return _baseVersionMap.get(baseKey);
else
return null;
}
/**
* Returns the primary version for a base key.
*/
public ExpandVersion getPrimaryVersion(String baseKey)
{
ExpandVersionGroup versionGroup = getBaseVersionGroup(baseKey);
if (versionGroup != null)
return versionGroup.getPrimaryVersion();
else
return null;
}
/**
* Returns the set of base keys.
*/
public Set<String> getBaseKeySet()
{
return _baseVersionMap.keySet();
}
/**
* Returns the set of full versioned keys.
*/
public Set<String> getKeySet()
{
return _versionMap.keySet();
}
/**
* Version map uses the repository
*/
private TreeMap<String,ExpandVersion> buildVersionMap(TreeSet<String> keySet)
{
TreeMap<String,ExpandVersion> versionMap
= new TreeMap<String,ExpandVersion>();
for (String key : keySet) {
ExpandVersion version = createVersion(key);
versionMap.put(key, version);
}
return versionMap;
}
private ExpandVersion createVersion(String key)
{
String baseKey = key;
String version = "";
int p = baseKey.lastIndexOf('-');
if (p > 0) {
version = key.substring(p + 1);
if (isValidVersion(version)) {
baseKey = key.substring(0, p);
}
else {
version = "";
}
}
return new ExpandVersion(key, baseKey, version);
}
private boolean isValidVersion(String version)
{
if (! _isVersioning)
return false;
int length = version.length();
boolean isDigit = false;
for (int i = 0; i < length; i++) {
char ch = version.charAt(i);
if ('0' <= ch && ch <= '9')
isDigit = true;
else if (ch == '.')
return isDigit;
else
return false;
}
return isDigit;
}
/**
* Builds the base to group map.
*/
private TreeMap<String,ExpandVersionGroup>
buildVersionGroupMap(TreeMap<String,ExpandVersion> versionMap)
{
TreeMap<String,ExpandVersionGroup> baseVersionMap
= new TreeMap<String,ExpandVersionGroup>();
for (ExpandVersion version : versionMap.values()) {
String baseKey = version.getBaseKey();
ExpandVersionGroup versionGroup = baseVersionMap.get(baseKey);
if (versionGroup == null) {
versionGroup = new ExpandVersionGroup(version);
baseVersionMap.put(baseKey, versionGroup);
}
else {
versionGroup.addVersion(version);
}
}
return baseVersionMap;
}
@Override
public String toString()
{
return getClass().getSimpleName() + "[" + _id + "]";
}
}