0

I wrote this simple test Business Object API program.

import com.crystaldecisions.sdk.framework.*;
import com.crystaldecisions.sdk.occa.infostore.IInfoStore;
import com.crystaldecisions.sdk.occa.infostore.IInfoObject;
import com.crystaldecisions.sdk.occa.infostore.IInfoObjects;
import com.crystaldecisions.sdk.framework.IEnterpriseSession;
import com.crystaldecisions.sdk.framework.CrystalEnterprise;

import java.util.*;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;

class LogonToken {
    public static void main(String[] args) {
        final Map<String, List<String>> params = new HashMap<>();
        List<String> options = null;

    for (int i = 0; i < args.length; i++) {
        final String a = args[i];

        if (a.charAt(0) == '-') {
            if (a.length() < 2) {
                System.err.println("Error at argument " + a);
                return;
            }

            options = new ArrayList<>();
            params.put(a.substring(1), options);
        }
        else if (options != null) {
            options.add(a);
        }
        else {
            System.err.println("Illegal parameter usage");
            return;
        }
    }

    if (
      args.length == 0 || 
      params.get("-username") == null || 
      params.get("-username").size() == 0 || 
      params.get("-password") == null || 
      params.get("-password").size() == 0 || 
      params.get("-output-type") == null || 
      params.get("-output-type").size() == 0 ||
      params.get("-doc-id") == null || 
      params.get("-doc-id").size() == 0 ||
      params.get("-s-id-type") == null || 
      params.get("-s-id-type").size() == 0 ||
      params.get("-cms-auth-type") == null || 
      params.get("-cms-auth-type").size() == 0 || 
      params.get("-cms-name") == null || 
      params.get("-cms-name").size() == 0
    ) {
      printArgumentsError("");
      return;
    }

    String username = params.get("-username").get(0);
    String password = params.get("-password").get(0);
    String output_type = params.get("-output-type").get(0);
    String doc_id = params.get("-doc-id").get(0);
    String s_id_type = params.get("-s-id-type").get(0);
    String cms_name = params.get("-cms-name").get(0);
    String cms_auth_type = params.get("-cms-auth-type").get(0);

    if (output_type.equals("url")) {
      System.out.println("URL: " + getUrl(username, password, doc_id, s_id_type, cms_name, cms_auth_type));

    } else {
      if (output_type.equals("token")) {
        System.out.println("TOKEN: " + getToken(username, password, doc_id, s_id_type, cms_name, cms_auth_type));

      } else {
        printArgumentsError("Output type must be either url or token. You provided: *" + params.get("-output-type").get(0) + "*");
      }
    }
}

public static String getToken(String username, String password, String doc_id, String s_id_type, String cms_name, String cms_auth_type) {
  try {
    return openDocumentToken(username, password, cms_name, cms_auth_type);
  } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    return "ERROR: " + e.getMessage();
  } catch (SDKException e) {
    return "ERROR: " + e.getMessage();
  }
}

public static String getUrl(String username, String password, String doc_id, String s_id_type, String cms_name, String cms_auth_type) {
  try {
    return ( "http://<server>:<port>/BOE/OpenDocument/opendoc/openDocument.jsp?iDocID=" + doc_id + "&sIDType=" + s_id_type + "&token=" + openDocumentToken(username, password, cms_name, cms_auth_type));
  } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    return "ERROR: " + e.getMessage();
  } catch (SDKException e) {
    return "ERROR: " + e.getMessage();
  }
}

public static String openDocumentToken(String username, String password, String cms_name, String cms_auth_type) throws UnsupportedEncodingException, SDKException  
{ 
  IEnterpriseSession sess = CrystalEnterprise.getSessionMgr().logon(username, password, cms_name, cms_auth_type);
  String token = sess.getLogonTokenMgr().createLogonToken("", 600, 600);
  String tokenEncode = URLEncoder.encode( token, "UTF-8");
  // String tokenEncode = URLEncoder.encode("Test", "UTF-8");

  return tokenEncode;
}

public static void printArgumentsError(String error) {
  System.out.println("");
  System.out.println("======================================");
  System.out.println(error); 
  System.out.println("Please provide all required arguments:");
  System.out.println("--username username");
  System.out.println("--password password");
  System.out.println("--output-type output_type (url or token)");
  System.out.println("--doc-id iDocID");
  System.out.println("--s-id-type sIDType (ex. CUID)");
  System.out.println("--cms-name cms_type (ex. \"<cms>:<port>\", double quotes are required in such case)");
  System.out.println("--cms-auth-type auth_type (ex. secEnterprise)");
  System.out.println("");
  System.out.println("Example invokation:");
  System.out.println("java LogonToken --username tmiskiew --password AwesomePass --output-type token --doc-id 12345 --s-id-type CUID --cms-name \"<cms>:<port>\" --cms-auth-type secEnterprise");
  System.out.println("");
  System.out.println("======================================");
  System.out.println("");
}}

I placed my LogonToken.java in C:\Cache\libz together with at the required jars.

Compilation works just fine.

However when I try to run it

C:\Cache\libz>"C:\Program Files\Java\jdk1.7.0_45\bin\java" -cp . LogonToken --username myUser --password mySecret --output-type url --doc-id ATKhgk7J3CtHizezzIfibUAE --s-id-type CUID --cms-name myHost

I get this:

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: com/rsa/cryptoj/f/tK (wrong name: com/rsa/cryptoj/f/tk)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at com.businessobjects.bcm.internal.BcmRsaLib.initialize(BcmRsaLib.java:214)
        at com.businessobjects.bcm.internal.BcmRsaLib.<clinit>(BcmRsaLib.java:289)
        at com.businessobjects.bcm.BCM.<clinit>(BCM.java:1144)
        at com.crystaldecisions.enterprise.ocaframework.BCMInitializer.run(BCMInitializer.java:29)
        at java.lang.Thread.run(Thread.java:744)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.businessobjects.bcm.BCM
        at com.crystaldecisions.sdk.occa.security.internal.ConfidentialChannelService.establishConfidentialChannel(ConfidentialChannelService.java:175)
        at com.crystaldecisions.sdk.occa.security.internal.ConfidentialChannelService.createConfidentialChannel(ConfidentialChannelService.java:145)
        at com.crystaldecisions.sdk.occa.security.internal.CCMap.locateCCItem(CCMap.java:63)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:845)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:805)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.userLogon(LogonService.java:210)
        at com.crystaldecisions.sdk.occa.security.internal.SecurityMgr.userLogon(SecurityMgr.java:166)
        at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon_aroundBody0(SessionMgr.java:454)
        at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon_aroundBody1$advice(SessionMgr.java:512)
        at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon(SessionMgr.java:1)
        at LogonToken.openDocumentToken(LogonToken.java:105)
        at LogonToken.getUrl(LogonToken.java:94)
        at LogonToken.main(LogonToken.java:69)

Any idea what that "wrong name" type of error is trying to tell me? The compiler knows the class during the compilation time, why is it complaining during the run time. This is so confusing for me as an occasional java programmer.

Thomas
  • 693
  • 2
  • 11
  • 23
  • When you build your project, use the output directory option, that way it will place the classes in the correct directories. eg `javac -d build/ ...` Otherwise, tell us how you built your classes. – matt Oct 03 '16 at 19:04
  • I'm in c:\cache\libz where all the libraries are located. Here I created the dir com/mycopmany/app/module and put my LogonToken.Java file. I added package com.mycompany.app.module; as first line in my java file. The sill in c:\cache\ I ran c:\Cache>"C:\Program Files\Java\jdk1.7.0_45\bin\javac" -cp C:\Cache\libz C:\Cache\com\mycompany\app\module\LogonToken.java and it worked. The file LogonToken.class is now in C:\Cache\com\mycompany\app\module\ However when I run it as shown above I get that ugly wrong name error – Thomas Oct 04 '16 at 13:50
  • In your example you don't include `C:\Cache\libz` in your classpath when you run it. Did you try `-cp C:\Cache\libz;.`? – matt Oct 04 '16 at 14:08
  • Yeah I did that. Same error. – Thomas Oct 04 '16 at 15:06
  • You claim your .class file is in one directory, but you are running your file from someplace else, and not adding the location of your file to the classpath. Reading your stacktrace the problem actually appears to be `CrystalEnterprise.getSessionMgr().logon` Maybe you should add a tag for that technology because it appears to be causing your error. – matt Oct 04 '16 at 15:17
  • You're right. I cleaned up the dirs and not it's working. – Thomas Oct 04 '16 at 18:49
  • First I went ahead and created a new dir c:\dev. Inside I created the dirs com\mycompany\app\module and lib. I placed the LogonToken.java inside the modul and all my libs inside of lib. I changed to the module dir and compiled javac -cp c:\dev\libs;. LogonToken.java. The I switched to c:\dev and ran java -cp c:\dev\libs;. com.mycompany.app.module.LogonToken – Thomas Oct 04 '16 at 19:04

1 Answers1

2

Looks to me similar like here: NoClassDefFoundError: wrong name. So what's your package name and have you tried calling "C:\Program Files\Java\jdk1.7.0_45\bin\java" -cp . my.package.namespace.LogonToken ?

Community
  • 1
  • 1
gtonic
  • 2,295
  • 1
  • 24
  • 32
  • Dumb question. Is a package name obligatory? – Thomas Oct 03 '16 at 19:04
  • You're in good company, that's what I've been asking myself. Looks like not: http://stackoverflow.com/questions/17797941/do-i-have-to-use-package-term-in-every-class , however there seem to be advantages in having it http://stackoverflow.com/questions/30398646/why-do-java-source-files-require-package-declarations – gtonic Oct 03 '16 at 19:09