Skip to content

Commit

Permalink
Merge pull request #26 from promovicz/prom/enhancements
Browse files Browse the repository at this point in the history
Various cleanups by @promovicz
  • Loading branch information
martinpaljak authored Mar 19, 2018
2 parents 27bfb57 + 4615d20 commit daec8c4
Show file tree
Hide file tree
Showing 3 changed files with 479 additions and 315 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ Details:
* `aid` attribute - AID (hex) of the package. Recommended - or set to the 5 first bytes of the applet AID if left unspecified.
* `output` attribute - path where to save the generated CAP file. Required.
* `export` attribtue - path (folder) where to place the JAR and generated EXP file. Optional.
* `jar` attribute - path where to save the generated archive JAR file. Optional.
* `jca` attribute - path where to save the generated JavaCard Assembly (JCA) file. Optional.
* `verify` attribute - if set to false, disables verification of the resulting CAP file with offcardeverifier. Optional.
* `debug` attribute - if set to true, generates debug CAP components. Optional.
Expand Down
167 changes: 167 additions & 0 deletions src/main/java/pro/javacard/ant/JCKit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/**
* Copyright (c) 2015-2018 Martin Paljak
* <p>
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* <p>
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* <p>
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package pro.javacard.ant;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class JCKit {

public static JCKit detectSDK(String path) {
if (path == null || path.trim() == "") {
return null;
}

File root = new File(path);
if(!root.isDirectory()) {
return null;
}

Version version = detectSDKVersion(root);
if(version == null) {
return null;
}

return new JCKit(root, version);
}

private static Version detectSDKVersion(File root) {
Version version = null;
File libDir = new File(root, "lib");
if (new File(libDir, "tools.jar").exists()) {
version = JCKit.Version.V3;
} else if (new File(libDir, "api21.jar").exists()) {
version = JCKit.Version.V21;
} else if (new File(libDir, "converter.jar").exists()) {
// assume 2.2.1 first
version = Version.V221;
// test for 2.2.2 by testing api.jar
File api = new File(libDir, "api.jar");
try {
ZipFile apiZip = new ZipFile(api);
ZipEntry testEntry = apiZip.getEntry("javacardx/apdu/ExtendedLength.class");
if(testEntry != null) {
version = JCKit.Version.V222;
}
} catch (IOException ignored) {
// do not ignore this, escalate it
throw new RuntimeException(ignored);
}
}
return version;
}

private Version version = Version.NONE;
private File path = null;

public JCKit(File root, Version version) {
this.path = root;
this.version = version;
}

public File getRoot() {
return path;
}

public Version getVersion() {
return version;
}

public boolean isVersion(Version v) {
return version.equals(v);
}

public String getJavaVersion() {
switch(version) {
case V3:
return "1.5";
case V222:
return "1.3";
case V221:
return "1.2";
case V21:
default:
return "1.1";
}
}

public File getJar(String name) {
File libDir = new File(path, "lib");
return new File(libDir, name);
}

public File getApiJar() {
switch (version) {
case V21:
return getJar("api21.jar");
case V3:
return getJar("api_classic.jar");
default:
return getJar("api.jar");
}
}

public File getExportDir() {
switch (version) {
case V21:
return new File(path, "api21_export_files");
default:
return new File(path, "api_export_files");
}
}

public List<File> getToolJars() {
List<File> jars = new ArrayList<>();
switch (version) {
case V3:
jars.add(getJar("tools.jar"));
break;
default:
jars.add(getJar("converter.jar"));
jars.add(getJar("offcardverifier.jar"));
break;
}
return jars;
}

enum Version {
NONE, V21, V221, V222, V3;

@Override
public String toString() {
if (this.equals(V3))
return "v3.x";
if (this.equals(V222))
return "v2.2.2";
if (this.equals(V221))
return "v2.2.1";
if (this.equals(V21))
return "v2.1.x";
return "unknown";
}
}

}
Loading

0 comments on commit daec8c4

Please sign in to comment.