001/* ***** BEGIN LICENSE BLOCK ***** 002 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 003 * 004 * The contents of this file are subject to the Mozilla Public License Version 005 * 1.1 (the "License"); you may not use this file except in compliance with 006 * the License. You may obtain a copy of the License at 007 * http://www.mozilla.org/MPL/ 008 * 009 * Software distributed under the License is distributed on an "AS IS" basis, 010 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 011 * for the specific language governing rights and limitations under the 012 * License. 013 * 014 * The Original Code is part of dcm4che, an implementation of DICOM(TM) in 015 * Java(TM), hosted at https://github.com/gunterze/dcm4che. 016 * 017 * The Initial Developer of the Original Code is 018 * Agfa Healthcare. 019 * Portions created by the Initial Developer are Copyright (C) 2012 020 * the Initial Developer. All Rights Reserved. 021 * 022 * Contributor(s): 023 * See @authors listed below 024 * 025 * Alternatively, the contents of this file may be used under the terms of 026 * either the GNU General Public License Version 2 or later (the "GPL"), or 027 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 028 * in which case the provisions of the GPL or the LGPL are applicable instead 029 * of those above. If you wish to allow use of your version of this file only 030 * under the terms of either the GPL or the LGPL, and not to allow others to 031 * use your version of this file under the terms of the MPL, indicate your 032 * decision by deleting the provisions above and replace them with the notice 033 * and other provisions required by the GPL or the LGPL. If you do not delete 034 * the provisions above, a recipient may use your version of this file under 035 * the terms of any one of the MPL, the GPL or the LGPL. 036 * 037 * ***** END LICENSE BLOCK ***** */ 038 039package org.dcm4che3.tool.dcmvalidate; 040 041import java.io.File; 042import java.io.IOException; 043import java.util.Arrays; 044import java.util.List; 045import java.util.ResourceBundle; 046 047import org.apache.commons.cli.CommandLine; 048import org.apache.commons.cli.MissingOptionException; 049import org.apache.commons.cli.OptionBuilder; 050import org.apache.commons.cli.Options; 051import org.apache.commons.cli.ParseException; 052import org.dcm4che3.data.Attributes; 053import org.dcm4che3.data.IOD; 054import org.dcm4che3.data.ValidationResult; 055import org.dcm4che3.io.DicomInputStream; 056import org.dcm4che3.tool.common.CLIUtils; 057import org.dcm4che3.util.SafeClose; 058 059/** 060 * @author Gunter Zeilinger <gunterze@gmail.com> 061 * 062 */ 063public class DcmValidate { 064 065 private static ResourceBundle rb = 066 ResourceBundle.getBundle("org.dcm4che3.tool.dcmvalidate.messages"); 067 068 private IOD iod; 069 070 public final void setIOD(IOD iod) { 071 this.iod = iod; 072 } 073 074 @SuppressWarnings("unchecked") 075 public static void main(String[] args) { 076 try { 077 CommandLine cl = parseComandLine(args); 078 DcmValidate main = new DcmValidate(); 079 String iodFile = cl.getOptionValue("iod"); 080 if (iodFile == null) 081 throw new MissingOptionException(Arrays.asList("iod")); 082 main.setIOD(IOD.load(iodFile)); 083 List<String> fnames = cl.getArgList(); 084 if (fnames.isEmpty()) 085 throw new ParseException(rb.getString("missing")); 086 087 for (String fname : fnames) 088 validate(main, new File(fname)); 089 090 } catch (ParseException e) { 091 System.err.println("DcmValidate: " + e.getMessage()); 092 System.err.println(rb.getString("try")); 093 System.exit(2); 094 } catch (IOException e) { 095 System.err.println("DcmValidate: " + e.getMessage()); 096 System.exit(2); 097 } 098 } 099 100 private static void validate(DcmValidate main, File file) { 101 if (file.isDirectory()) 102 for (File f : file.listFiles()) 103 validate(main, f); 104 105 main.validate(file); 106 } 107 108 public void validate(File file) { 109 if (iod == null) 110 throw new IllegalStateException("IOD net initialized"); 111 DicomInputStream dis = null; 112 try { 113 System.out.print("Validate: " + file + " ... "); 114 dis = new DicomInputStream(file); 115 Attributes attrs = dis.readDataset(-1, -1); 116 ValidationResult result = attrs.validate(iod); 117 if (result.isValid()) 118 System.out.println("OK"); 119 else { 120 System.out.println("FAILED:"); 121 System.out.println(result.asText(attrs)); 122 } 123 } catch (IOException e) { 124 System.out.println("FAILED: " + e.getMessage()); 125 } finally { 126 SafeClose.close(dis); 127 } 128 } 129 130 @SuppressWarnings("static-access") 131 private static CommandLine parseComandLine(String[] args) 132 throws ParseException{ 133 Options opts = new Options(); 134 CLIUtils.addCommonOptions(opts); 135 opts.addOption(OptionBuilder 136 .withLongOpt("iod") 137 .hasArg() 138 .withArgName("iod-file") 139 .withDescription(rb.getString("iod")) 140 .create(null)); 141 return CLIUtils.parseComandLine(args, opts, rb, DcmValidate.class); 142 } 143}