środa, 9 listopada 2016

Java Generic - Collection casting case

Java Generic - Collection casting case


import java.util.*;
public class J1
{
  public static void main(String[] args)
  {
    class a1 { public String toString() { return "a1";} }
    class b extends a1 { public String toString() { return "b";} }
    class c extends a1 { public String toString() { return "c";} }
    class d extends a1 { public String toString() { return "d";} }
    List<a1> l1 = new ArrayList<a1>();
    l1.add(new a1());
    l1.add(new b());
    l1.add(new c());
    l1.add(new d());
   
//    l1.
    List<b> l2 = new ArrayList<b>();
    l2.add(new b());
    l2.add(new b());
   
   
    for (a1 a : l1)
    {
      // to nie dziala
//      B b = a;
//      l2.add(a);
    }
//      l2 = l1;
   
    for(b b : l2)
    {
      l1.add(b);
    }
   
    System.out.println("l1:" + l1);
    for (a1 a: l1)
    {
      System.out.println("l1.a:" + a);
    }
//    l1 = l2;
//    l2 = l1;
   
    l2 = (List)l1;
    System.out.println("l2:" + l2);
    List l3 = l1;
    for (a1 b: l2)
    {
      System.out.println("l2.b:" + b);
    }
   
    l1 = (List)l2;
    System.out.println("l1:" + l2);
  }
}



l1:[a1, b, c, d, b, b]
l1.a:a1
l1.a:b
l1.a:c
l1.a:d
l1.a:b
l1.a:b
l2:[a1, b, c, d, b, b]
l2.b:a1
l2.b:b
l2.b:c
l2.b:d
l2.b:b
l2.b:b
l1:[a1, b, c, d, b, b]
 

 

sobota, 3 września 2016

Groovy - podstawy

Ciekawe elementy z groovy które szybko można zrobić

Odpalenie groovy jako skrypt

Do lini trzeba dodać 
#!/usr/bin/env groovy

Parsowanie parametrów CLI 

Przydatny fagment programu wsadowego który może być przy praktycznie każdym skrypcie CLI

def cli = new CliBuilder(
 usage: scriptFileName,
 header: 'Description\nAvailable options (use -h for help):\n',
 footer: '')
cli.with
{
 h(longOpt: 'help', 'Help - Usage Information')
 opt1(longOpt: 'Option 1', 'Option 1 description')
}
def opt = cli.parse(args)
if (!opt) return
if (opt.h) {
 cli.usage()
 return
}
// ciag dalszy programu


TreeSet z ignore case

Przydatny gdy chcemy sortować bez Case Sensitive
def IGNORE_CASE = new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
};
def set1 = new TreeSet<String>(IGNORE_CASE)


Przeszukiwanie rekursywne katalogu

import static groovy.io.FileType.FILES
...
def dir = new File("/sciezka do katalogu")
dir.eachFileRecurse(FILES) {
    if(it.name.endsWith("nazwa-pliku")) {

    // robota do zrobienia jak jest plik
    }
}


Czytanie z pliku (iterator lini)

def file1 = new File("sciezka")
file1.eachLine { line ->
 println line
}



niedziela, 8 maja 2016

iSeries DB2 - reverse enginering składowych DB2 z poziomu SQL

Podczas pierwszego uruchomienia iSeries Navigator-a jest zakładana w schemacie QIWS procedura QZDGDBGS która pozwala odczytywać kod źródłowy zdefiniowanych elementów. W zależności od wersji systemu iSeries ma różna ilość parametrów. Procedura jest wywoływana z poziomu navigatora do generacji kodu. Nie jest bezpośrednio opisana w dokumentacji.

  • name - nazwa obiektu
  • schema - nazwa schemy
  • type - TABLE, VIEW, INDEX, ALIAS, FUNCTION, PROCEDURE, TYPE, CONSTRAINT, SCHEMA, TRIGGER, SEQUENCE

Ważne aby podany element do generacji oddzielić znakiem \0

Dla starszych wersji < 5.4 ma postać z 20 parametrami IN:
  • 01 - '02','01'
  • 02 - output file
  • 03 - output schema
  • 04 - output member
  • 05 - 0,1 isAppend 
  • 06 - 0,1 is format statement
  • 07 - date format
  • 08 - date separator
  • 09 - time format
  • 10 - time separator
  • 11 - decimal separator
  • 12 - 0,1 is as400 Extensions
  • 13 - naming convention
  • 14 - 0,1 is as400 Extensions & is label on
  • 15 - = 14
  • 16 - 0,1 is drop statements
  • 17 - '000','010' is info messages
  • 18 - 1 ?
  • 19 - '00001' ?
  • 20 - element selector
CALL QIWS.QZDGDBGS(
'01', '', '', '', '1',
'1', 'ISO', '-', 'ISO', '.',
'.', '0', 'SQL', '1', '1',
'0', '000' ,'1', '00001', '${name}\0${schema}\0${type}')


W nowszych wersjach > 7.x ma 25 parametrów IN (5 dodatkowych)
  • 21 - systemName
  • 22 - triggers
  • 23 - triggers
  • 24 - sql privileges
  • 25 - ?

CALL QIWS.QZDGDBGS(
'01', '', '', '', '1',
'1', 'ISO', '-', 'ISO', '.',
'.', '0', 'SQL', '1', '1',
'0', '000' ,'1', '00001', '${name}\0${schema}\0${type}',
'0', '1' ,'1', '1', '0'
)

Procedura wywołuje natywne mechanizmy na iSeries do pozyskania źródła elementu. Jedne z lepszych sposobów na pozyskanie poprawnych znaków w opisach elementów.

Rezultat wynikowy to kod źródłowy w postaci tekstu.

Niewiele o tym piszą którka wzmianka w http://newsolutions.de/forum-systemi-as400-i5-iseries/archive/index.php/t-19498.html

Od wersji 7.1.9 dstępne jako QSYS2.GENERATE_SQL w wersji z 33 parametry IN (specific name QSQGENSQL)

Na podstawie cwbundbf.jar DBG_GenerateSQLBean

piątek, 1 stycznia 2016