/* * [ProjectInfo.java] * * Summary: Zzz punches out ANT scripts for one project. * * Copyright: (c) 1999-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.2 2005-07-29 */ package com.mindprod.zzz; import com.mindprod.common18.Build; import com.mindprod.common18.EIO; import com.mindprod.common18.ST; import com.mindprod.hunkio.PrintWriterPlus; import com.mindprod.prices.AppCat; import com.mindprod.prices.Licence; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.Arrays; import java.util.EnumSet; import static com.mindprod.prices.Licence.FREE; import static com.mindprod.zzz.CompilerCat.*; import static java.lang.System.*; /** * Zzz punches out ANT scripts for one project. * * @author Roedy Green, Canadian Mind Products * @version 1.2 2005-07-29 * @since 2004-05-20 */ class ProjectInfo { /** * certificate used to sign code, without .cer. Must like in .keystore */ static final String CODE_SIGNING_CERT = Build.MINDPRODCERT; /** * name of the TCC human readable file */ static final String OVERVIEW_FILE = "_O_V_E_R_V_I_E_W.txt"; /** * where website in on the Internet. */ static final String WEBSITE_URL = "http://mindprod.com"; /** * true if want extra debugging output */ private static final boolean DEBUGGING = false; /** * used on echo with attracting flashy, but not flashing chars, in Unicode */ private static final String leftFlash = " \u00b0\u00b1\u00b2 "; // was ░▒▓ \u2591\u2592\u2593 \u00b0\u00b1\u00b2 /** * where the PML files are kept. */ private static final String PAD_PML_DIR = "C:/Users/roedy/Documents/PADGen/canadian_mind_products/"; /** * there the XML pad files are kept */ private static final String PAD_XML_DIR = "E:/mindprod/pad/"; /** * used on echo with attracting flashy, but not flashing chars. Encoded in Unicode */ private static final String rightFlash = " \u00b2\u00b1\u00b0 "; // was ▓▒░ \u2593\u2592\u2591 \u00b2\u00b1\u00b0 ))) »»» /** * where website is on local hard disk. */ private static final String WEBROOT = "E:/mindprod"; /** * does project have a PAD 4.0 */ protected final PADType padType; /** * what sort of anomalise we forgive */ final EnumSet forgive; /** * packages that need to be in zip, but which are not in jar */ final String[] extraPackages; /** * where css file are kept e.g. E:/mindprod */ final String antCssDir; /** * description of what this project is about. */ final String description; /** * true if signed */ final boolean isSigned; /** * does this project use 32-bit JNI? */ final boolean usesJni32; /** * does this project use 64-bit JNI? */ final boolean usesJni64; /** * does this project use any kind of JNI? */ final boolean usesJni; /** * how this project handles jni */ private final JniUse jniUse; /** * how this project handle signing */ private final Signing signing; /** * how project used zips */ private final ZipUse zipUse; /** * enumerated howRun e.g. APPLICATION APPLET HYBRID JWS LIBRARY UTILITY DOCUMENTATION. */ AppCat appCat; /** * which kind of compiler to use for the compile. */ CompilerCat compilerCat; /** * licencing arrangement for this program */ Licence pcLicence; /** * exe names for the alternate main classes. e.g. fontshower.exe. */ String[] altExeFilesUnqual; /** * alternate forxxxxjar.xml names. */ String[] altForJarNames; /** * alternate main classes jar *.look file where put manifests of alternate jars */ String[] altJarLookNames; /** * jar names for the alternate main classes. e.g. fontshower.jar. */ String[] altJarNames; /** * alternate main classes for this package, in lower case. */ String[] altProgLowers; /** * alternate main classes for this package. */ String[] altAppNames; /** * names of alternate main class java files. e.g. FontShower.java. restore.asm split.cpp */ String[] altSourceNames; /** * alterate main class jars. e.g. com/mindprod/fontshower/fontshower.exe. */ String[] antAltExeFiles; /** * alterate main class jars. e.g. com/mindprod/fontshower/fontshower.jar. */ String[] antAltJarFiles; /** * alternate main classes fully qualified e.g. com.mindprod.htmlmacros.ReplaceMindprod. */ String[] dotAltMainClassFullyQualifieds; /** * options for Javac compiler. */ String[] javacOptions; /** * alterate main class jars. e.g. com\mindprod\fontshower\fontshower.jar. */ String[] winAltJarFiles; /** * where *.ico files are stored to distribute them on the web. */ String antIcoDir; /** * where icon.png files are stored to distribute them on the web. for big logo icon. E:/mindprod/image/icon128 */ String antIcon128Dir; /** * here icon16ss are. Where icon.png files are stored to distribute them on the web. smaller than 16x16 for link * icon, E:/mindprod/image/icon16 */ String antIcon16Dir; /** * where icon.png files are stored to distribute them on the web. E:/mindprod/image/icon32 e.g. 32x32 */ String antIcon32Dir; /** * where icon48 icons are, E:/mindprod/image/icon48 */ String antIcon48Dir; /** * where icon64 icons are, E:/mindprod/image/icon64 */ String antIcon64Dir; /** * fully qualified name of jar file e.g. com/mindprod/fontshower/fontshower.jar. */ String antJarFile; /** * where jar files are stored to distribute them on the web e.g. E:/mindprod/applet. */ String antJarWebDir; /** * fully qualified name of jnlp file e.g. com/mindprod/setclock/setclock.jnlp. */ String antJnlpFileQual; /** * fully qualified executable name e.g.e.g. com/mindprod/fontshower/fontshower.exe. */ String antMainExeFileQual; /** * where pad.mxl and .htm/ ASP description files are stored to distribute them on the web. e.g. E:/mindprod/pad. */ String antPadDir; /** * where use files are stored to distribute them on the web. e.g. E:/mindprod/precis. */ String antPrecisDir; /** * e.g. com/mindprod/fontshower. */ String antProjectDir; /** * qualified name of zip file distributable. e.g. com/mindprod/converter/converter42.zip" with slashes */ String antZipFileQual; /** * where zip files are stored to distribute them on the web. e.g. E:/mindprod/zips. */ String antZipWebDir; /** * bat file command for Windows to set you at the windows install/project directory * e.g. * E: * CD E:\com\mindprod\myproject */ String cdToWinProjectDir; /** * fully qualified main class name without .class e.g. com.mindprod.fontshower.FontShower. */ String dotMainClassQual; /** * fully qualified package name. e.g. com.mindprod.fontshower. */ String dotPackageQual; /** * ideal JDK version to use. */ String jdkVersionString; /** * main class name e.g. FontShower. */ String mainClassName; /** * executable name e.g. fontshower.exe. or restore.com */ String mainExeFileUnqual; /** * unqualified name of jar look file where put manifest of main jar.. */ String mainJarLookNameUnqual; /** * name of application with a lead cap. */ String mainAppName; /** * unqualified name of jar file e.g. fontshower.jar. */ String mainJarName; /** * main class name e.g. FontShower.java restore.asm */ String mainSourceName; /** * unqualified zip name of previous zip version. e.g. converter12.zip. */ String oldZipNameUnqual; /** * yyyy-mm-dd program under consideration released. */ String pcOfficialRELEASE_DATE; /** * price as a string in US dollars e.g. "10.00" or "0.00". */ String pcPrice; /** * human name for project. e.g. FontShower, project, also name of main class if any with upper and lower case */ String projectHumanName; /** * project name in lower case. e.g. fontshower. */ String projectLower; /** * project name in upper case. e.g. FONTSHOWER. */ String projectUpper; /** * where screenshot png files are stored to distribute them on the web. e.g. E:/mindprod/screenshots. */ String screenshotDir; /** * javac source JDK, e.g. "1.5" */ String sourceVersionString; /** * where splash gif files are stored to distribute them on the web. e.g. E:/mindprod/splash. */ String splashDir; /** * javac target JDK, e.g. "1.6" */ String targetVersionString; /** * e.g. "1.7" version of app. */ String versionString; /** * e.g. E:\com\mindprod\fontshower. winProjectDir is missing the lead drive. */ String winAbsoluteProjectDir; /** * fully qualified name of jar file e.g. com\mindprod\fontshower\fontshower.jar. */ String WinJarFileQual; /** * qualified name of zip file distributable. e.g. E:\com\mindprod\converter\converter42.zip" */ String winZipFileQual; /** * manifest of the zip . */ String zipLookName; /* unqualified name of zip file distributable. e.g. "converter42.zip" */ String zipFileUnqual; /** * true if we generate a zip with source code for distribution. */ boolean hasDistributedZip; /** * does this project have a jar. */ boolean hasJar; /** * true if this package has a main class, and hence an executable. */ boolean hasMainProg; /** * true if we generate a zip with source code for distribution. */ boolean hasZip; /** * can JET static compilation be used? */ boolean jetable; /** * is there a jar to post on the website */ boolean postJar; /** * does this project have an associated html file? */ boolean runsFromHtml; /** * true if we build an Ant script to build this project */ boolean usesAnt; /** * how many alternate main classes there are. */ int altProgsCount; /** * year this project was copyrighted, e.g. 1996. Only for Java can we glean a better value. */ int firstCopyrightYear = Build.THIS_COPYRIGHT_YEAR; /** * Page number in the products catalog this package is displayed on, 0 if none. */ int pcPage; /** * name ASP calls this program */ String pcAspName; /** * if version is 1.7, this is 17. */ int versionTimesTen; /** * alternate main class jars. e.g. com\mindprod\fontshower\fontshower.exe. */ private String[] winAltExeFilesQual; /** * unqualified name of jnlp file e.g. esper.jnlp. */ private String jnlpFileUnqual; /** * qualified project dir with \. e.g. com\mindprod\fontshower, but without drive letter. * see winAbsoluteProjectDir */ private String winProjectDir; /** * Create a new project * * @param pi copy constructor, used by classes extending this one. */ @SuppressWarnings( { "SameParameterValue" } ) ProjectInfo( ProjectInfo pi ) { this( pi.projectHumanName, pi.versionTimesTen / 10.d, Double.parseDouble( pi.jdkVersionString ), pi.firstCopyrightYear, pi.description, pi.appCat, pi.signing, pi.jniUse, pi.zipUse, pi.padType, pi.forgive, pi.extraPackages, pi.altAppNames ); } /** * Create a new project * * @param mainAppName e.g. FontShower, that name is lower case becomes a segment of the package name, and also * the directory segment where the project lives. * @param version version of the program the version is 1.7 * @param jdkVersion version of the JDK ideally desired * @param description one sentence of what this project does. * @param appCat APPLET,APPLICATION, "JWS", HYBRID, "utility", "documentation" , "servlet", or alias * @param signing SIGNED or UNSIGNED describing if digitally signed * @param jniUse USES_JNI32 if uses usesJni32, NO_JNI otherwise. * @param zipUse DISTRIBUTE_ZIP if post source code, NO_ZIP otherwise. * @param padType which version of PAD we use, or none. * @param forgive set of thing we should forgive this project for * @param extraPackages packages for zip but not jar, could be done with forzip.xml * @param altAppNames alternate main classes */ @SuppressWarnings( { "SameParameterValue" } ) ProjectInfo( final String mainAppName, final double version, double jdkVersion, int firstCopyrightYear, final String description, final AppCat appCat, final Signing signing, final JniUse jniUse, final ZipUse zipUse, final PADType padType, final EnumSet forgive, final String[] extraPackages, final String... altAppNames ) { Arrays.sort( altAppNames ); String prev = null; for ( String prog : altAppNames ) { if ( prog.equals( mainAppName ) || prog.equals( prev ) ) { err.println( "duplicate alt prog name " + prog + " in " + mainAppName ); } prev = prog; } appCatInferences( appCat, jdkVersion ); compilerCatInferences( mainAppName ); projectNameInferences( mainAppName ); altInferences( appCat, altAppNames ); versionInferences( version, jdkVersion ); this.firstCopyrightYear = firstCopyrightYear; this.description = description; this.signing = signing; this.isSigned = signing == Signing.SIGNED; this.jniUse = jniUse; this.usesJni32 = jniUse == JniUse.USES_JNI32 || jniUse == JniUse.USES_JNI64; this.usesJni64 = jniUse == JniUse.USES_JNI64; this.usesJni = usesJni32 || usesJni64; this.forgive = forgive; this.extraPackages = extraPackages; this.zipUse = zipUse; this.padType = padType; zipInferences( zipUse ); this.antCssDir = WEBROOT; } /** * emits echo with attracting flashy, but not flashing chars * * @param text of echo * * @return bat text for an echo in flashes. */ static String echoFlash( String text ) { return "@echo" + leftFlash + text + rightFlash + "\nrem encoded in IBM850\n"; } /** * Save contents into a text file. * * @param fullyQualifiedFilename fully qualified filename. * @param contents new contents of the file. * @param encoding encoding to use for file generated * @param overwrite true if should overwrite an existing file. */ static void save( String fullyQualifiedFilename, String contents, final Charset encoding, boolean overwrite ) { try { File saveFile = new File( fullyQualifiedFilename ); if ( !overwrite && saveFile.exists() ) { return; } PrintWriterPlus emit = new PrintWriterPlus( EIO.getBufferedWriter( saveFile, 32 * 1024, encoding ) ); // localise line endings. emit.emit( contents ); emit.close(); if ( DEBUGGING ) { // assert file.length() >= contents.length() : "save too short"; assert Math.abs( System.currentTimeMillis() - saveFile.lastModified() ) <= 5000L : "save failed to change" + " date"; } } catch ( IOException e ) { err.println( "trouble generating file:" + fullyQualifiedFilename ); err.println(); e.printStackTrace( err ); } } /** * compute fields thas depend on aux classes * * @param appCat APPLET,APPLICATION, "JWS", HYBRID, "utility", "documentation" , "servlet", or alias * @param altAppNames alternate main classes */ private void altInferences( final AppCat appCat, final String... altAppNames ) { this.altProgsCount = altAppNames.length; this.dotAltMainClassFullyQualifieds = new String[ altProgsCount ]; this.altExeFilesUnqual = new String[ altProgsCount ]; this.altForJarNames = new String[ altProgsCount ]; this.altJarLookNames = new String[ altProgsCount ]; this.altJarNames = new String[ altProgsCount ]; this.altSourceNames = new String[ altProgsCount ]; this.altAppNames = new String[ altProgsCount ]; this.altProgLowers = new String[ altProgsCount ]; this.antAltExeFiles = new String[ altProgsCount ]; this.antAltJarFiles = new String[ altProgsCount ]; this.winAltExeFilesQual = new String[ altProgsCount ]; this.winAltJarFiles = new String[ altProgsCount ]; for ( int i = 0; i < altProgsCount; i++ ) { this.altAppNames[ i ] = altAppNames[ i ]; this.altProgLowers[ i ] = altAppNames[ i ].toLowerCase(); this.altExeFilesUnqual[ i ] = altProgLowers[ i ] + ( appCat == AppCat.ASMCOM ? ".com" : ".exe" ); this.altForJarNames[ i ] = "for" + altProgLowers[ i ] + "jar.xml"; this.altJarLookNames[ i ] = altProgLowers[ i ] + ".look"; this.altJarNames[ i ] = altProgLowers[ i ] + ".jar"; switch ( this.compilerCat ) { case ASM: this.altSourceNames[ i ] = this.altAppNames[ i ].toLowerCase() + ".asm"; break; case C: this.altSourceNames[ i ] = this.altAppNames[ i ].toLowerCase() + ".c"; break; case CPP: this.altSourceNames[ i ] = this.altAppNames[ i ].toLowerCase() + ".cpp"; break; case JAVA: this.altSourceNames[ i ] = this.altAppNames[ i ] + ".java"; break; case NONE: this.altSourceNames[ i ] = null; break; } this.antAltExeFiles[ i ] = antProjectDir + "/" + this.altExeFilesUnqual[ i ]; this.antAltJarFiles[ i ] = antProjectDir + "/" + this.altJarNames[ i ]; this.dotAltMainClassFullyQualifieds[ i ] = dotPackageQual + "." + this.altAppNames[ i ]; this.winAltExeFilesQual[ i ] = winProjectDir + "\\" + this.altExeFilesUnqual[ i ]; this.winAltJarFiles[ i ] = winProjectDir + "\\" + this.altJarNames[ i ]; } } /** * /** compute fields thas depend on whether the application category * * @param appCat APPLET,APPLICATION, "JWS", HYBRID, "utility", "documentation" , "servlet", or alias * @param jdkVersion e.g. 1.6 */ private void appCatInferences( final AppCat appCat, double jdkVersion ) { this.appCat = appCat; switch ( this.appCat ) { case APPLET: this.compilerCat = JAVA; this.runsFromHtml = true; this.hasJar = true; this.hasMainProg = true; this.jetable = false; this.postJar = true; this.usesAnt = true; break; case APPLICATION: this.compilerCat = JAVA; this.runsFromHtml = false; this.hasJar = true; this.hasMainProg = true; this.jetable = true; this.postJar = false; // can't run app from website. this.usesAnt = true; break; case ASMCOM: case ASMEXE: this.compilerCat = ASM; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = true; this.jetable = false; this.postJar = false; this.usesAnt = true; break; case BUNDLE: this.compilerCat = NONE; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = false; this.jetable = false; this.postJar = false; this.usesAnt = false; break; case CPPUTILITY: this.compilerCat = CPP; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = true; this.jetable = false; this.postJar = false; this.usesAnt = true; break; case CUTILITY: this.compilerCat = C; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = true; this.jetable = false; this.postJar = false; this.usesAnt = true; break; case DOCUMENTATION: this.compilerCat = NONE; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = false; this.jetable = false; this.postJar = false; this.usesAnt = false; break; case HYBRID: this.compilerCat = JAVA; this.runsFromHtml = true; this.hasJar = true; this.hasMainProg = true; this.jetable = true; this.postJar = true; this.usesAnt = true; break; case JWS: this.compilerCat = JAVA; this.runsFromHtml = true; this.hasJar = true; this.hasMainProg = true; this.jetable = false; this.postJar = true; this.usesAnt = true; break; case JAVA_CLASS_LIBRARY: this.compilerCat = JAVA; this.hasJar = true; this.hasMainProg = true; // make create a dummy with comments/dates etc. this.jetable = false; this.postJar = false; this.usesAnt = true; break; case JAVA_SNIPPETS: this.compilerCat = JAVA; this.hasJar = false; this.hasMainProg = false; this.jetable = false; this.postJar = false; this.usesAnt = true; break; case SERVLET: this.compilerCat = JAVA; this.runsFromHtml = false; this.hasJar = false; this.hasMainProg = false; this.jetable = false; this.postJar = false; this.usesAnt = false; break; } // Jet can only do up to version 1.8 if ( jdkVersion > 1.8 ) { jetable = false; } } /** * Calc source and target jdk versions for Javac, also javac options that go with that JDK. */ void calcJDKVersions() { this.javacOptions = new String[ 0 ]; this.sourceVersionString = this.jdkVersionString; this.targetVersionString = this.jdkVersionString; switch ( this.jdkVersionString ) { case "1.8": case "1.7": // also possible -Xlint:serial // not -ea -ed since they are for java.exe this.javacOptions = new String[] { "-Xlint:unchecked", "-Xlint:fallthrough", "-Xlint:deprecation", "-Xlint:cast" }; break; case "1.6": // also possible -Xlint:serial // not -ea -ed since they are for java.exe this.javacOptions = new String[] { "-Xlint:unchecked", "-Xlint:fallthrough", "-Xlint:deprecation", "-Xlint:cast" /* "-Xlint:-processing" */ }; break; case "1.5": // also possible -Xlint:serial // not -ea -ed since they are for java.exe this.javacOptions = new String[] { "-Xlint:unchecked", "-Xlint:fallthrough", "-Xlint:deprecation", "-Xlint:cast" }; break; case "1.4": // no enums, with assert, has nio this.javacOptions = new String[] { "-Xlint:deprecation", "-Xlint:cast" }; break; case "1.3": // no assert, no regex, no nio, has Swing this.javacOptions = new String[] { "-Xlint:deprecation", "-Xlint:cast" }; break; case "1.2": // no swing, with ArrayList, Collections this.sourceVersionString = "1.3";// have to lie this.javacOptions = new String[] { "-encoding=\"UTF-8\"", "-Xlint:deprecation", "-Xlint:cast" }; break; case "1.1": // no ArrayList, has Reader/Writer this.sourceVersionString = "1.3";// have to lie this.javacOptions = new String[] { "-Xlint:deprecation" }; break; default: throw new IllegalArgumentException( "unsupported jdk version: " + jdkVersionString ); } } /** * fields that depend on the choice of compiler category * * @param mainAppName e.g. FontShower, that name is lower case becomes a segment of the package name, and also * the directory segment where the project lives. */ private void compilerCatInferences( final String mainAppName ) { switch ( this.compilerCat ) { case ASM: this.mainClassName = mainAppName.toLowerCase(); this.mainSourceName = this.mainClassName + ".asm"; break; case C: this.mainClassName = mainAppName.toLowerCase(); this.mainSourceName = this.mainClassName + ".c"; break; case CPP: this.mainClassName = mainAppName.toLowerCase(); this.mainSourceName = this.mainClassName + ".cpp"; break; case JAVA: this.mainClassName = mainAppName; this.mainSourceName = this.mainClassName + ".java"; break; default: case NONE: this.mainClassName = mainAppName; this.mainSourceName = null; break; } } /** * get PAD *pml file. * * @return File of for PML version of current PAD file */ File getPADPmlFile() { return new File( PAD_PML_DIR + ST.chopTrailingString( projectLower, "!" ) + ".pml" ); } /** * get PAD xml file * * @return File for XML version of current PAD file */ File getPADXmlFile() { return new File( PAD_XML_DIR + projectLower + ".xml" ); } /** * compute fields that depend on the project name * * @param mainAppName e.g. FontShower, that name is lower case becomes a segment of the package name, and also * the directory segment where the project lives. */ private void projectNameInferences( final String mainAppName ) { this.projectHumanName = mainAppName; this.projectLower = mainAppName.toLowerCase(); this.projectUpper = mainAppName.toUpperCase(); this.antProjectDir = "com/mindprod/" + projectLower; this.winProjectDir = "com\\mindprod\\" + projectLower; this.winAbsoluteProjectDir = "E:\\" + winProjectDir; this.cdToWinProjectDir = "Rem adjust drive letter before use:\nE:\ncd E:\\" + winProjectDir + "\n"; this.dotPackageQual = "com.mindprod." + projectLower; this.mainAppName = mainAppName; this.dotMainClassQual = dotPackageQual + "." + mainAppName; this.mainExeFileUnqual = projectLower + ( appCat == AppCat.ASMCOM ? ".com" : ".exe" ); this.mainJarLookNameUnqual = projectLower + ".look"; this.mainJarName = projectLower + ".jar"; this.jnlpFileUnqual = projectLower + ".jnlp"; this.antMainExeFileQual = antProjectDir + "/" + this.mainExeFileUnqual; this.antJarFile = antProjectDir + "/" + this.mainJarName; this.WinJarFileQual = winProjectDir + "\\" + this.mainJarName; this.antJnlpFileQual = antProjectDir + "/" + this.jnlpFileUnqual; } /** * compute fields that depend on whether Progam and JDK versions * * @param version version of the program the version is 1.7 * @param jdkVersion version of the JDK ideally desired */ private void versionInferences( final double version, final double jdkVersion ) { this.versionTimesTen = ( int ) Math.round( version * 10 ); this.versionString = ( versionTimesTen / 10 ) + "." + ( versionTimesTen % 10 ); this.jdkVersionString = Double.toString( jdkVersion ); calcJDKVersions(); } /** * compute fields that depend on whether we distribute zips * * @param zipUse DISTRIBUTE_ZIP if post source code, NO_ZIP otherwise. */ private void zipInferences( ZipUse zipUse ) { this.hasZip = zipUse == ZipUse.DISTRIBUTE_ZIP || zipUse == ZipUse.RESTRICTED_ZIP; this.hasDistributedZip = zipUse == ZipUse.DISTRIBUTE_ZIP; final PriceCapsule pc = PriceCapsule.findPriceCapsule( this.projectLower ); if ( pc == null ) { this.pcPage = 0; this.pcOfficialRELEASE_DATE = ""; this.pcLicence = FREE; this.pcPrice = "0.00"; } else { this.pcAspName = pc.getAspName(); this.pcPage = pc.getPage(); this.pcOfficialRELEASE_DATE = pc.getOfficialRELEASE_DATE().toString(); this.pcLicence = pc.getLicence(); this.pcPrice = pc.getPrice(); } if ( hasZip ) { this.zipFileUnqual = projectLower + versionTimesTen + ".zip"; this.antZipFileQual = antProjectDir + "/" + zipFileUnqual; this.winZipFileQual = winProjectDir + "/" + zipFileUnqual; this.oldZipNameUnqual = projectLower + ( versionTimesTen - 1 ) + ".zip"; this.zipLookName = "zip.look"; } this.antIcon16Dir = WEBROOT + '/' + AppCat.getIcon16Dir(); this.antIcon32Dir = WEBROOT + '/' + AppCat.getIcon32Dir(); this.antIcoDir = WEBROOT + '/' + AppCat.getIcoDir(); this.antIcon48Dir = WEBROOT + '/' + AppCat.getIcon48Dir(); this.antIcon64Dir = WEBROOT + '/' + AppCat.getIcon64Dir(); this.antIcon128Dir = WEBROOT + '/' + AppCat.getIcon128Dir(); this.antJarWebDir = WEBROOT + '/' + this.appCat.getJarDir(); this.antPadDir = WEBROOT + '/' + AppCat.getPadDir(); this.antPrecisDir = WEBROOT + '/' + AppCat.getPrecisDir(); this.screenshotDir = WEBROOT + '/' + AppCat.getScreenshotDir(); this.splashDir = WEBROOT + '/' + AppCat.getSplashDir(); this.antZipWebDir = WEBROOT + '/' + AppCat.getZipDir(); } }