/*
* 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.repository;
import com.caucho.vfs.*;
import java.util.*;
import java.io.*;
/**
* Represents a committed tag root
*/
public class RepositoryTagEntry
{
private final String _tagName; // the tag name "webapps/foo/bar"
private final String _treeHash; // sha1 hash of the content tree
private final String _tagEntryHash; // sha1 of the entry itself
private final String _parent; // sha1 of the parent tag entry
private final Map<String,String> _attributeMap;
/**
* Create a new entry, storing the serialized form in the repository.
*/
public RepositoryTagEntry(AbstractRepository repository,
String tagName,
String treeHash,
String parent,
Map<String,String> attributeMap)
throws IOException
{
if (tagName == null)
throw new NullPointerException();
if (treeHash == null)
throw new NullPointerException();
_tagName = tagName;
_treeHash = treeHash;
_parent = parent;
HashMap<String,String> map;
if (attributeMap != null)
map = new HashMap<String,String>(attributeMap);
else
map = new HashMap<String,String>();
map.put("tag", tagName);
map.put("root", treeHash);
if (parent != null)
map.put("parent", parent);
_attributeMap = map;
TempStream os = new TempStream();
WriteStream out = new WriteStream(os);
writeEntry(out);
out.close();
InputStream is = os.getInputStream();
try {
_tagEntryHash = repository.addBlob(is);
} finally {
is.close();
}
}
/**
* Create a new entry, storing the serialized form in the repository.
*/
public RepositoryTagEntry(AbstractRepository repository,
String sha1)
throws IOException
{
_tagEntryHash = sha1;
InputStream is = repository.openBlob(sha1);
try {
ReadStream in = Vfs.openRead(is);
_attributeMap = readMap(in);
in.close();
_tagName = _attributeMap.get("tag");
_treeHash = _attributeMap.get("root");
_parent = _attributeMap.get("parent");
} finally {
is.close();
}
}
/**
* Returns the tag's name
*/
public String getName()
{
return _tagName;
}
/**
* Returns the hash of the entry's root
*/
public String getRoot()
{
return _treeHash;
}
/**
* Returns the hash of the entry itself
*/
public String getTagEntryHash()
{
return _tagEntryHash;
}
public Map<String,String> getAttributeMap()
{
return _attributeMap;
}
private Map<String,String> readMap(ReadStream is)
throws IOException
{
HashMap<String,String> map = new HashMap<String,String>();
String line;
while ((line = is.readLine()) != null) {
int p = line.indexOf(": ");
String key = line.substring(0, p);
String value = line.substring(p + 2);
while (value.endsWith("\\")) {
value = value.substring(0, value.length() - 1);
line = is.readLine();
if (line != null)
value += line;
}
map.put(key, value);
}
return map;
}
private void writeEntry(WriteStream out)
throws IOException
{
for (Map.Entry<String,String> entry : _attributeMap.entrySet()) {
writePair(out, entry.getKey(), entry.getValue());
}
}
private void writePair(WriteStream out, String key, String value)
throws IOException
{
if (value == null)
return;
while (value.endsWith("\\") || value.endsWith("\n"))
value = value.substring(0, value.length() - 1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < value.length(); i++) {
char ch = value.charAt(i);
if (ch != '\n')
sb.append(ch);
else
sb.append("\\\n");
}
value = sb.toString();
out.print(key);
out.print(": ");
out.println(value);
}
@Override
public String toString()
{
return getClass().getSimpleName() + "[" + _tagName + ",root=" + _treeHash + "]";
}
}