Package sos.spooler

Examples of sos.spooler.Order


   * \return Variable_set
   *
   */

  public Variable_set getParameters() {
    Order order = null;
    try {
//      Variable_set params = spooler.create_variable_set();
      Variable_set params = spooler_task.params();

      if (spooler_task.job().order_queue() != null) {
        order = spooler_task.order();
        if (order.params() != null)
          params.merge(order.params());
      }
      return params;
    }
    catch (Exception e) {
      String strM = String.format(Messages.getMsg("JSJ-E-100"), e.getMessage());
View Full Code Here


    if (spooler_task.params() != null) {
      spooler_task.params().set_var(pstrKey, pstrValue);
    }
    if (spooler_task.order() != null) {
      Order order = spooler_task.order();
      if (order.params() != null) {
        order.params().set_var(pstrKey, pstrValue);
      }
    }
    if (objJobOrOrderParams != null) {
      objJobOrOrderParams.set_var(pstrKey, pstrValue);
    }
View Full Code Here

  @Override  // JSJobUtilities
  public String getCurrentNodeName() {
   
    final String  conMethodName  = conClassName + "::getNodeName";
    String lstrNodeName = "";
    Order objCurrentOrder = spooler_task.order();
   
    if (objCurrentOrder != null) {
      lstrNodeName = objCurrentOrder.state();
      logger.info (String.format("%1$s: Current NodeName is '%2$s'.", conMethodName, lstrNodeName));
    }
    else {
      Job objCurrentJob = spooler_task.job();
      lstrNodeName = objCurrentJob.name();
View Full Code Here

              newParams.set_var("ftp_file_path", fileName.getCanonicalPath());
              newParams.set_var("ftp_parent_order_id", spooler_task.order().id());
              newParams.set_var("ftp_order_self_destruct", "1");

              Order newOrder = spooler.create_order();
              newOrder.set_state(spooler_task.order().state());
              newOrder.set_params(newParams);

              spooler.job_chain(spooler_task.order().job_chain().name()).add_order(newOrder);

              getLogger().info("launching order for parallel transfer with parameter ftp_file_path: " + fileName.getCanonicalPath());

              spooler.variables().set_var("ftp_order", normalize(spooler_task.order().id()) + "." + normalize(newOrder.id()) + "." + "0");
              spooler.variables().set_var("ftp_check_send_" + normalize(spooler_task.order().id()) + "." + normalize(newOrder.id()), "0");

            }
            // am aktuellen Auftrag speichern, dass im Wiederholungsfall per setback() nicht erneut Auftr�ge erzeugt werden sollen, sondern dass deren Erledigungszustand gepr�ft wird:
            spooler_task.order().params().set_var("ftp_check_parallel", "yes");
            spooler_job.set_delay_order_after_setback(1, parallelTransferCheckSetback);
View Full Code Here

     * @throws Exception
     */
    public static SOSConnection getOrderConnection(SOSConnection connection, Job_impl job) throws Exception {
       
      SOSConnection localConnection = null;
        Order order = null;
       
        boolean useManagedConnection = true;
        // boolean rc = false;
        HashMap result = null;
        String spoolerId = job.spooler.id().toLowerCase();
        Variable_set taskParams = job.spooler_task.params();
        Variable_set orderPayload = null;
       
        String managedVersion = job.spooler.var("scheduler_managed_jobs_version");
      if (managedVersion==null || managedVersion.length()==0) managedVersion = "1";
      job.spooler_log.debug6("scheduler_managed_jobs_version: "+managedVersion);
      Variable_set mergedParams = job.spooler.create_variable_set();
      mergedParams.merge(taskParams);
      if(job.spooler_task.job().order_queue()!=null){
        order = job.spooler_task.order();
        orderPayload = order.params();
        mergedParams.merge(orderPayload);
      }
      String connectionName = mergedParams.var("database_connection");
     
      // check if job uses ProcessDatabaseJob Parameters:
      if (mergedParams.var("db_class").length()>0 &&
          mergedParams.var("db_driver").length()>0 &&
          mergedParams.var("db_url").length()>0 ){
        useManagedConnection=false;
      }
        if(job.spooler_task.job().order_queue()!=null && useManagedConnection){          
          String jobChain = order.job_chain().name();
          // String jobChainModel = "";
          String orderId = getOrderIdInTable(spoolerId, jobChain, order);         
         
            job.spooler_log.debug3("Connection from payload:"+connectionName);
             
View Full Code Here

     * @throws Exception
     */
    public static String getOrderCommand(SOSConnection connection, Job_impl job) throws Exception{
           
      job.spooler_log.debug9("entered getOrderCommand()...");
      Order order = job.spooler_task.order();
      job.spooler_log.debug9("order!=null: "+(order!=null));
      String spoolerID = job.spooler.id().toLowerCase();
      job.spooler_log.debug9("spoolerID: "+spoolerID);
      Job_chain chain = order.job_chain();
      job.spooler_log.debug9("chain!=null: "+(chain!=null));
      String jobChainName = chain.name();
      job.spooler_log.debug9("jobChainName: "+jobChainName);
      String orderID = getOrderIdInTable(spoolerID, jobChainName, order);
     
    String command = "";
    try{
      job.spooler_log.debug9("trying to get Command from order.payload()...");
      sos.spooler.Variable_set orderPayload = (sos.spooler.Variable_set) order.payload();
     
      command=orderPayload.var("command");
      if (command==null || command.length()==0) command = orderPayload.var("scheduler_order_command");
    } catch (Exception e) {}
   
    if(command!=null && command.length()>0) {
      if (isHex(command))
        command = new String(fromHexString(command),"US-ASCII");     
    }
   
    try{
      String managedVersion = job.spooler.var("scheduler_managed_jobs_version");
      if (managedVersion==null || managedVersion.length()==0) managedVersion = "1";
      job.spooler_log.debug6("scheduler_managed_jobs_version: "+managedVersion);
    if ((command==null || command.length()==0) && managedVersion.equalsIgnoreCase("1")){
      job.spooler_log.debug9("trying to get Command from table "+ getTableManagedOrders()+" ...");
        if (!order.id().startsWith("-")) {
          command = connection.getClob("SELECT \"COMMAND\" FROM " + getTableManagedOrders() +
          " WHERE \"SPOOLER_ID\"='" + job.spooler.id().toLowerCase() + "' AND \"JOB_CHAIN\"='" + order.job_chain().name() + "'" +
          " AND \"ORDER_ID\"='" + orderID + "'");
        } else {
        command = connection.getClob("SELECT \"COMMAND\" FROM " + getTableManagedOrders() +
            " WHERE \"SPOOLER_ID\" IS NULL AND \"JOB_CHAIN\"='" + order.job_chain().name() + "'" +
            " AND \"ORDER_ID\"='" + orderID + "'");
        }
      }
    } catch(Exception e){}
     
View Full Code Here

     *
     */
   
    public boolean spooler_process() {

        Order order = null;
        Variable_set params = null;
        SCPClient scpClient = null;

        try {
            try { // to fetch parameters from orders that have precedence over job parameters
                params = spooler_task.params();
               
                if (spooler_task.job().order_queue() != null) {
                    order = spooler_task.order();
                    if ( order.params() != null)
                      params.merge(order.params());
                }
               
                // get basic authentication parameters
                this.getBaseParameters();
               
View Full Code Here

  /**
   * process order
   */
  public boolean spooler_process() {

    Order order = null;
    orderPayload = null;
    String program = "";
    String logFile = "";
    String priorityClass = "normal";

    try {
      super.prepareParams();

      String command = "";
      try {
        if (orderJob) {
          command = JobSchedulerManagedObject.getOrderCommand(this.getConnection(), this);
          order = spooler_task.order();
        }
        if (command == null || command.trim().length() == 0) {
          command = JobSchedulerManagedObject.getJobCommand(this.getConnection(), this);
        }

        // overidden for custom implementation
        command = modifyCommand(command);

        if (command == null || command.trim().length() == 0)
          throw new Exception("command is empty");

      }
      catch (Exception e) {
        throw (new Exception("no executable command found for order:" + e));
      }
      getLogger().debug3("command before replacements:\n" + command);
      // if ( orderData == null || orderData.var("command") == null || orderData.var("command").toString().length() == 0)
      // throw (new Exception("no executable command found in order payload"));
      boolean ignoreError = false;
      boolean ignoreSignal = false;
      boolean ignoreStderr = false;
      boolean ignoreTimeout = false;

      boolean timedOut = false;
      boolean ownProcessGroup = false;

      if (orderPayload != null) {
        replaceAliases(orderPayload, inputParameterAliases);

        if (orderPayload.var("ignore_error") != null
            && (orderPayload.var("ignore_error").toString().equalsIgnoreCase("true") || orderPayload.var("ignore_error").equalsIgnoreCase("1") || orderPayload.var(
                "ignore_error")
                .equalsIgnoreCase("yes"))) {
          ignoreError = true;
        }
        if (orderPayload.var("ignore_signal") != null
            && (orderPayload.var("ignore_signal").toString().equalsIgnoreCase("true") || orderPayload.var("ignore_signal").equalsIgnoreCase("1") || orderPayload.var(
                "ignore_signal")
                .equalsIgnoreCase("yes"))) {
          ignoreSignal = true;
        }
        if (orderPayload.var("ignore_stderr") != null
            && (orderPayload.var("ignore_stderr").toString().equalsIgnoreCase("true") || orderPayload.var("ignore_stderr").equalsIgnoreCase("1") || orderPayload.var(
                "ignore_stderr")
                .equalsIgnoreCase("yes"))) {
          ignoreStderr = true;
        }
        if (orderPayload.var("ignore_timeout") != null
            && (orderPayload.var("ignore_timeout").toString().equalsIgnoreCase("true") || orderPayload.var("ignore_timeout").equalsIgnoreCase("1") || orderPayload.var(
                "ignore_timeout")
                .equalsIgnoreCase("yes"))) {
          ignoreTimeout = true;
        }
        if (orderPayload.var("own_process_group") != null
            && (orderPayload.var("own_process_group").toString().equalsIgnoreCase("true")
                || orderPayload.var("own_process_group").equalsIgnoreCase("1") || orderPayload.var("own_process_group").equalsIgnoreCase("yes"))) {
          ownProcessGroup = true;
        }
        if (orderPayload.var("log_file") != null && orderPayload.var("log_file").toString().length() > 0) {
          logFile = orderPayload.var("log_file").toString();
        }
        if (orderPayload.var("priority_class") != null && orderPayload.var("priority_class").toString().length() > 0) {
          priorityClass = orderPayload.var("priority_class").toString();
        }
        // for compatibility with ProcessSubprocessJob
        if (orderPayload.var("scheduler_order_command_parameters") != null
            && orderPayload.var("scheduler_order_command_parameters").toString().length() > 0) {
          command += " " + orderPayload.var("scheduler_order_command_parameters").toString();
        }
      }
      // the path of the interpreter is given with this parameter
      if (spooler_task.params().var("interpreter") != null && spooler_task.params().var("interpreter").length() > 0) {
        program = spooler_task.params().var("interpreter");
        spooler_log.debug3("Using interpreter: " + program);
      }

      spooler_log.debug3("current setting ignore_error: " + ignoreError);
      spooler_log.debug3("current setting ignore_signal: " + ignoreSignal);
      spooler_log.debug3("current setting own_process_group: " + ownProcessGroup);

      spooler_log.debug9("logFile.lentgh:" + logFile.length());
      if (logFile.length() > 0) {
        spooler_log.debug3("current setting log_file: " + logFile);
      }
      // parse environment variables

      /*if(orderData!=null && orderData.var("environment")!=null && orderData.var("environment").toString().length() > 0){
        String environment=orderData.var("environment").toString();
         Pattern envPattern = Pattern.compile("\\{[^\\}]*\\}");
          Matcher envMatcher = envPattern.matcher(environment);
          spooler_log.debug3("environment variables:");
          while(envMatcher.find()){
            String nameValueBr=envMatcher.group();
            String nameValue=nameValueBr.substring(1,nameValueBr.length()-1);
            spooler_log.debug3("  "+nameValue);
            String[] nameValueArr=nameValue.split("=");
            if (nameValueArr.length!=2){
              spooler_log.warn("Incorrect Syntax for Name=Value Pair.");
              continue;
            }
            subProc.set_environment(nameValueArr[0], nameValueArr[1]);
          }

      }*/

      // replace job-specific placeholders
      command = command.replaceAll("(\\$|�)\\{scheduler_order_job_name\\}", this.getJobName());
      command = command.replaceAll("(\\$|�)\\{scheduler_order_job_id\\}", Integer.toString(this.getJobId()));
      command = command.replaceAll("(\\$|�)\\{scheduler_id\\}", spooler.id());
      if (orderJob)
        if (order != null) {
            command = command.replaceAll("(\\$|�)\\{scheduler_order_id\\}", order.id());
        }

      // replace parameters
      if (orderPayload != null) {
        command = JobSchedulerManagedObject.replaceVariablesInCommand(command, orderPayload, getLogger());
      }

      // replace newlines
      command = command.replaceAll("\r\n", "\n");
      getLogger().debug3("Command after replacements:\n" + command);

      String[] commands = command.split("\n");
      getLogger().debug6("Found " + commands.length + " commands.");
      // neu: mit subprocess

      for (int i = 0; i < commands.length && !timedOut; i++) {
        Subprocess subProc = spooler_task.create_subprocess();
        subProc.set_own_process_group(ownProcessGroup);
        subProc.set_ignore_error(ignoreError);
        subProc.set_ignore_signal(ignoreSignal);
        subProc.set_priority_class(priorityClass);
        try {
          setEnvironment(orderPayload, subProc);
        }
        catch (Exception e) {
          throw new Exception("Error occured setting environment variables: " + e);
        }
        // execute interpreter
        if (program != null && program.length() > 0) {
          subProc.start(program + " " + commands[i]);
          spooler_log.info("executing \"" + program + " " + commands[i] + "\"");
        }
        else {
          subProc.start(commands[i]);
          spooler_log.info("executing \"" + commands[i] + "\"");
        }
        if (orderPayload != null && orderPayload.var("timeout") != null && orderPayload.var("timeout").toString().length() > 0
            && !orderPayload.var("timeout").toString().equals("0")) {
          spooler_log.info("executable file is launched with process id " + subProc.pid() + " for timeout in "
              + orderPayload.var("timeout").toString() + "s");
          boolean terminated = subProc.wait_for_termination(Double.parseDouble(orderPayload.var("timeout").toString()));
          if (!terminated) {
            spooler_log.info("timeout reached, process will be terminated.");
            subProc.kill();
            subProc.wait_for_termination();
            timedOut = true;
          }

        }
        else {
          spooler_log.info("executable file is launched with process id " + subProc.pid());
          subProc.wait_for_termination();

        }
        if (!timedOut)
          spooler_log.info("file executed");
        spooler_log.debug9("Exit code: " + subProc.exit_code());

        boolean stdErrEmpty = true;
        String stdErrString = "";
        String stdOutString = "";
        spooler_log.info("std_out for " + commands[i] + ":");
        while (stdoutStream != null && stdoutStream.ready()) {
          String stdOutLine = stdoutStream.readLine();
          spooler_log.info(stdOutLine);
          stdOutString += stdOutLine + "\n";
        }
        spooler_log.info("std_err for " + commands[i] + ":");

        while (stderrStream != null && stderrStream.ready()) {
          String stdErrLine = stderrStream.readLine();
          spooler_log.info(stdErrLine);
          if (stdErrLine.trim().length() > 0)
            stdErrEmpty = false;
          stdErrString += stdErrLine + "\n";
        }
        if (orderJob && order != null) {
          Variable_set realOrderPayload = order.params();
          SetVar(realOrderPayload, conStd_err_output, stdErrString);
          SetVar(realOrderPayload, conStd_out_output, stdOutString);
          SetVar(realOrderPayload, conExit_code, "" + subProc.exit_code());
          SetVar(realOrderPayload, "timed_out", "" + timedOut);
          // for compatibility with SubProcessJob
          SetVar(realOrderPayload, "scheduler_order_terminated", (!timedOut ? "true" : "false"));
          replaceAliases(realOrderPayload, outputParameterAliases);
        } // additionally set task parameters for use with copy-from:
        Variable_set taskParams = spooler_task.params();
        SetVar(taskParams, conStd_err_output, stdErrString);
        SetVar(taskParams, conStd_out_output, stdOutString);
        SetVar(taskParams, conExit_code, "" + subProc.exit_code());
        SetVar(taskParams, "timed_out", "" + timedOut);
        replaceAliases(taskParams, outputParameterAliases);

        if (timedOut && !ignoreTimeout) {
          throw new Exception("Process had to be killed because of timeout");
        }
        if ((subProc.exit_code() != 0)) {
          if (ignoreError)
            spooler_log.info("Command terminated with exit code: " + subProc.exit_code());
          else
            throw new Exception("Command terminated with exit code: " + subProc.exit_code());
        }
        if ((subProc.termination_signal() != 0)) {
          if (ignoreSignal)
            spooler_log.info("Command terminated with signal: " + subProc.termination_signal());
          else
            throw new Exception("Command terminated with signal: " + subProc.termination_signal());
        }
        if (!ignoreStderr && !stdErrEmpty) {
          throw new Exception("Command terminated with text in stderr:\n" + stdErrString);
        }

      }

      return orderJob;
    }
    catch (Exception e) {
      if (orderJob)
        spooler_log.warn("error occurred processing managed order ["
            + ((order != null) ? "Job Chain: " + order.job_chain().name() + ", ID:" + order.id() : "(none)") + "] : " + e);
      else
        spooler_log.warn("error occurred processing executable file: " + e);
      spooler_task.end();
      return false;
    }
View Full Code Here

  /**
   * Parameter auslesen
   */
  private Variable_set getParameters() throws Exception {
    Order order = null;
    try {     
      Variable_set params = spooler.create_variable_set();      
      params = spooler_task.params();

      if (spooler_task.job().order_queue() != null) {
        order = spooler_task.order();
        if ( order.params() != null)
          params.merge(order.params());
      }
      return params;
    } catch (Exception e) {
      throw new Exception("error occurred reading Patameter: " + e.getMessage());
    }
View Full Code Here

    /**
     * process single mail
     */
    public boolean spooler_process() {

        Order order = null;
        Variable_set orderData = null;
       
        int mailOrderId = 0;
        boolean rc = true;
       
        try {
          mailOrderId = Integer.parseInt( this.mailOrderIterator.next().toString());
          SOSMailOrder mailOrder = new SOSMailOrder(this.sosMailSettings, this.getConnection());
          if (this.getLogger() != null) mailOrder.setSOSLogger(this.getLogger());
          //  job scheduler sets mail host if no default was specified by settings
            if (mailOrder.getHost() == null || mailOrder.getHost().length() == 0) {
                if (!spooler_log.mail().smtp().equalsIgnoreCase("-queue")) {
                    mailOrder.setHost(spooler_log.mail().smtp());
                } else {
                    throw new Exception("no SMTP host was configured, global settings contain smtp=-queue");
                }
            }
             
           
            // job scheduler sets mail queue directory if no default was specified by parameters or settings
            if (mailOrder.getQueueDir() == null || mailOrder.getQueueDir().length() == 0)
              mailOrder.setQueueDir(this.getQueueDirectory());

            // set queue prefix "sos" to enalbe dequeueing by JobSchedulerMailDequeueJob
            mailOrder.setQueuePraefix(this.getQueuePrefix());
           
            // classic or order driven
            if (spooler_task.job().order_queue() == null) {                               
                mailOrder.load(mailOrderId);
                rc = this.mailOrderIterator.hasNext();
               
            } else {
                order = spooler_task.order();
                orderData = (Variable_set) spooler_task.order().payload();
               
                if ( orderData.var("id") == null || orderData.var("id").toString().length() == 0){
                    mailOrder.initOrder();
                    // TODO:Parameter dokumentieren
                    if(orderData.var("mail_from")!=null && orderData.var("mail_from").length()>0){
                      mailOrder.setFrom(orderData.var("mail_from"));
                    }
                    if(orderData.var("mail_to")!=null && orderData.var("mail_to").length()>0){
                      mailOrder.addRecipient(orderData.var("mail_to"));
                    }
                    if(orderData.var("mail_cc")!=null && orderData.var("mail_cc").length()>0){
                      mailOrder.addCC(orderData.var("mail_cc"));
                    }
                    if(orderData.var("mail_bcc")!=null && orderData.var("mail_bcc").length()>0){
                      mailOrder.addBCC(orderData.var("mail_bcc"));
                    }
                    if(orderData.var("mail_subject")!=null && orderData.var("mail_subject").length()>0){
                      mailOrder.setSubject(orderData.var("mail_subject"));
                    }
                    if(orderData.var("mail_body")!=null && orderData.var("mail_body").length()>0){
                      mailOrder.setBody(orderData.var("mail_body"));
                    }
                    if(orderData.var("mail_attachment")!=null && orderData.var("mail_attachment").length()>0){
                      mailOrder.addAttachment(orderData.var("mail_attachment"));
                    }
                } else{
                try{
                  mailOrder.load(mailOrderId);
                }catch (Exception e){
                    if (this.getLogger() != null) this.getLogger().info("failed to load order [" + orderData.var("id")+"]: " + e.getMessage());
                    return false;
                }
                }
                // setback this order for future target date
                if (mailOrder.getTargeted() != null) {
                    Date currentDate = SOSDate.getTime();
                    Date targetDate = mailOrder.getTargeted();
                    if (targetDate.after(currentDate)) {
                        Calendar target = Calendar.getInstance();
                        target.setTime(targetDate);
                        spooler_task.job().set_delay_order_after_setback(1, (target.getTimeInMillis()-System.currentTimeMillis())/1000);
                        spooler_task.order().setback();
                        if (this.getLogger() != null) this.getLogger().info("order is set back for target date: " + mailOrder.getTargeted().toString());
                        return false;
                    }
                }
            }

           
            try { // to check status: allow all status values except STATE_SUCCESS and STATE_CANCEL                   
                    switch (mailOrder.getStatus()) {
                        case STATE_SUCCESS: throw new Exception("mail order has already been successfully processed");
                        case STATE_CANCEL:  throw new Exception("mail order has already been cancelled");
                    }
               
            } catch (Exception ex) {
                if (this.getLogger() != null) this.getLogger().info("mail status [" + mailOrder.getStatus() + "] not applicable for order [" + mailOrder.getId() + "]: " + ex.getMessage());
                // return value for classic and order driven processing
                if (spooler_task.job().order_queue() == null) {
                    return this.mailOrderIterator.hasNext();
                } else {
                    return false;
                }
            }           
          
            try {
                File mailFile  = null;
                String message = "";

                // clear recipients for test purposes
                if (this.getMailTo() != null && this.getMailTo().length() > 0) {
                    if (this.getLogger() != null) this.getLogger().info("mail recipients [" + mailOrder.getRecipientsAsString() + "] are replaced by settings: " + this.getMailTo());
                    mailOrder.clearRecipients();
                    mailOrder.addRecipient(this.getMailTo());
                }

                if (this.getLogDirectory() != null && this.getLogDirectory().length() > 0) {
                    mailFile = this.getMailFile(this.getLogDirectory());
                    mailOrder.dumpMessageToFile(mailFile, true);
                }
                mailOrder.setModifiedBy(spooler_task.job().name());
                mailOrder.setJobId(spooler_task.id());
                if (this.isLogOnly()) {
                    message = "mail was NOT sent but stored to file: " + mailFile.getAbsolutePath();
                    if (this.getLogger() != null) this.getLogger().info(message);
                    message = (message.length() > 250 ? message.substring(message.length()-250) : message);
                    message = message.replaceAll("'", "''");
                } else mailOrder.send() ;

                if (this.getLogger() != null) this.getLogger().info("mail was " + (this.isLogOnly() ? "processed" : "sent") + " for order " + mailOrderId + " to: " + mailOrder.getRecipientsAsString());
               

                if (this.getLogger() != null) this.getLogger().debug3("mail was sent with headers: " + mailOrder.dumpHeaders());
            } catch (Exception ex) {
                throw new Exception("mail was NOT sent for order " + mailOrderId + ": " + ex.getMessage());
            }


            // return value for classic and order driven processing
            if (spooler_task.job().order_queue() == null) {
                return this.mailOrderIterator.hasNext();
            } else {
                return rc;
            }
        }   
        catch (Exception e) {
            if (spooler_task.job().order_queue() != null) {
                spooler_log.warn("error occurred processing mail [" + ((order != null) ? "job chain: " + order.job_chain().name() + ", order: " + order.id() : "(none)") + "]: " + e.getMessage());
            } else {
                spooler_log.warn("error occurred processing mail: " + e.getMessage());
            }           
           
            // restart this order driven task in case of errors to make the task log available by mail
View Full Code Here

TOP

Related Classes of sos.spooler.Order

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.