001 /* 002 * Jpkg - Java library and tools for operating system package creation. 003 * 004 * Copyright (c) 2007 Three Rings Design, Inc. 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without 008 * modification, are permitted provided that the following conditions 009 * are met: 010 * 1. Redistributions of source code must retain the above copyright 011 * notice, this list of conditions and the following disclaimer. 012 * 2. Redistributions in binary form must reproduce the above copyright 013 * notice, this list of conditions and the following disclaimer in the 014 * documentation and/or other materials provided with the distribution. 015 * 3. Neither the name of the copyright owner nor the names of contributors 016 * may be used to endorse or promote products derived from this software 017 * without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 029 * POSSIBILITY OF SUCH DAMAGE. 030 */ 031 package com.threerings.jpkg.debian; 032 033 import java.util.regex.Pattern; 034 035 /** 036 * Holds and parses the Debian package name. 037 * @see <a href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package">Debian Policy Manual</a> 038 */ 039 public class PackageName 040 implements ControlFileData 041 { 042 /** 043 * Construct a new package name. 044 * ControlDataInvalidException will be throw if the name is invalid. 045 * @throws ControlDataInvalidException 046 */ 047 public PackageName (String name) 048 throws ControlDataInvalidException 049 { 050 _name = validateName(name); 051 } 052 053 // from ControlFileData 054 public String getField () 055 { 056 return "Package"; 057 } 058 059 // from ControlFileData 060 public String getFieldValue () 061 { 062 return _name; 063 } 064 065 /** 066 * Validate the supplied package name. 067 */ 068 private String validateName (String name) 069 throws ControlDataInvalidException 070 { 071 if (name.length() < 2) { 072 throw new ControlDataInvalidException( 073 "Package name must be at least 2 characters long. name=[" + name + "]"); 074 } 075 076 if (!NAME_PATTERN.matcher(name).matches()) { 077 throw new ControlDataInvalidException( 078 "Package name must match the pattern. name=[" + name + "] pattern=[" + NAME_PATTERN.pattern() + "]"); 079 } 080 081 return name; 082 } 083 084 /** 085 * The regex against which the package name must match. 086 * From: <a href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Package">Debian Policy Manual</a> 087 * "Package names must consist only of lower case letters (a-z), digits (0-9), 088 * plus (+) and minus (-) signs, and periods (.). They must be at least two characters long 089 * and must start with an alphanumeric character." 090 */ 091 private static final Pattern NAME_PATTERN = 092 Pattern.compile("[\\p{Lower}\\p{Digit}][\\p{Lower}\\p{Digit}+-.]+"); 093 094 /** The package name. */ 095 private final String _name; 096 }