Archiv für Kategorie ‘Java’

Zertifikat in lokalen Java Keystore laden

Damit eine Java Anwendung ohne in einem Anwendungs Container SSL zur Verfügungen bekommen , trotzdem mit verschlüsselten Verbindungen arbeiten kann, müssen die Public Keys in den lokalen Zertifakats Store geladen werden….

Nur weiß man eigentlich nicht wo der bei Java ist oder wie das geht, darum dieser Artikel…zur Erinnerung

Der lokale Cert Store ist ein File bei der runtime im …\jre\lib\security folder.

Das Tool um das Cert zu sichern liegt in  ..\jre\bin und heisst einfach (bei Windows) keytool.exe

Der Befehl um ein Zertifikat in allen lokalen Anwendungen zur Verfügung zu haben muss so einmalig (unter Windows XP) ausgeführt werden

 

keytool.exe -import -file %PATHTOCERT%\subCA.cer -keystore "%PATHTOJRE%\jre\lib\security\cacerts" -alias "Irgend eine irrelevant Bezeichnung"

oder unter Unix


keytool.exe -import -file %PATHTOCERT%\subCA.cer -keystore "%PATHTOJRE%\jre\lib\security\cacerts" -alias "Irgend eine irrelevant Bezeichnung"

Sollte nach einem Passwort gefragt werden, kann man „changeit“ probieren“

Hier findet man weitere Beispiele um mit dem Keytool zu arbeiten

So jetzt kann man jede Menge Java Code schreiben, der Verschlüssel Webservices, Webseiten, Datenbanken usw abfragt…man braucht ja noch Projekte 😉

Extract tar.gz in Java

wieder mal was nettes in Java, daß man immer mal wieder braucht

benütigt wird org.apache.commons.compress !

Bestimmtes File aus einem tar.gz extrahieren

private boolean extractFile(String targzFile, String fileName) throws FileNotFoundException, IOException {

boolean extracted = false;
final File inputFile = new File(targzFile);
final GZIPInputStream in = new GZIPInputStream(new FileInputStream(inputFile));
final TarArchiveInputStream tarInput = new TarArchiveInputStream(in);
OutputStream outputFileStream = null;

TarArchiveEntry entry;

while (null!=(entry=tarInput.getNextTarEntry())) {
if(entry.getName().contains(fileName)){
String foundFile = entry.getName();
System.out.println("Found " + foundFile);
try{
foundFile = foundFile.substring(foundFile.indexOf("/")+1);
final File outputFile = new File(OUTPUT_DIR + "/",foundFile);
outputFileStream = new FileOutputStream(outputFile);
IOUtils.copy(tarInput, outputFileStream);
outputFileStream.close();
}catch (Exception ex){
ex.printStackTrace();
System.out.println("Failed extracting " + foundFile);
}
}
}

in.close();
tarInput.close();
outputFileStream.close();

return extracted;
}

tar File aus einem tar.gz extrahieren

private File unGzip(String targzFile, String tarFile) throws FileNotFoundException, IOException {

File inputFile = new File(targzFile);
File outputDir = new File(tarFile);

o.logDebug(String.format("Unzipping %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath()));

final File outputFile = new File(outputDir, inputFile.getName().substring(0, inputFile.getName().length() - 3));

final GZIPInputStream in = new GZIPInputStream(new FileInputStream(inputFile));
final FileOutputStream out = new FileOutputStream(outputFile);

IOUtils.copy(in, out);

in.close();
out.close();

return outputFile;
}

XML mit Java

habe mal wieder ne nette Library aufgetan, darum zur Erinnerung ein Beispiel wie man mit Dom4J ein XML erstellt


Document document = DocumentHelper.createDocument();
Element root = document.addElement( "scritturaDocument");

root.addElement("Year").setText("1990");
root.addElement("NextYear").setText("1991");
root.addElement("IS").setText("IDA");

if (root.elementText("Year") != null){
root.element("Year").setText("2014");
}else{
root.addElement("Year").setText("2014");
}

OutputFormat format = OutputFormat.createPrettyPrint();

StringWriter sw = new StringWriter();
final XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
System.out.println("XML Result:" + sw.toString());

Hallo World in Wicket

Wicket ist ein Java Webframework, daß sehr schlank und besonders nah am nativen Java Code sein will. Da ich gerade ein wenig versuchen will etwas im Embedded Berich zu machen, kommt mir das gerade recht. Leider funktioniert wie so of das Hallo World Beispiel nicht

Hier die notwendigen Schritte, die man auf der Console ausführen muss auch wenn man noch so viele Maven Plugins hat

mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=6.7.0 -DgroupId=com.trytry -DartifactId=myhelloworld -DarchetypeRepository=https://repository.apache.org/ -DinteractiveMode=false

cd myhelloworld/

mvn install

mvn compiler:compile

Danach in Eclipse ein existierendes Maven Projekt hinzufügen.
Dann als Java Applikation starten und wups hat man auf dem Localhost eine Wicket Webseite in einem embedded WebApp Server.

So wie ich es haben wollte. Nun kann ich das ganz ja zur richtigen Applikation aufbohren und dann auf einen Einplantinen PC portieren….

Naja wohl nicht ganz so adhock aber man braucht ja noch Projekte 😉

PreparedStatement komplett

In Java ist alles einfach und direkt, wenn man weiss wie ;p

Darum zu meiner Erinnerung einmal komplett wie man ein Datenbank Update mit einem PreparedStatement macht

Hier aus einem JUnit Test, bei einer Oracle Datenbank (DataBaseQuerySchema)

@Test
public void TestUpdateSiebenZwerge() {

double result = 0.0;

String sql = "INSERT INTO "
+ DataBaseQuery.SCHEMA
+ "Zwerge (NR, NAME, TALENT, COMMENTS, ORDERID) "
+ "VALUES (6, 'Nase', 'Buddeln', 'nett', (select max(ORDERID)+1 from Zwerge))";

try {

// Inject DataSource
String ZwergEnv = System.getProperty("ZWERG_ENV");

// Create initial context
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
InitialContext ctx = new InitialContext();

ctx.createSubcontext("java:");
ctx.createSubcontext("java:comp");
ctx.createSubcontext("java:comp/env");

// Construct DataSource
OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL("jdbc:oracle:thin:@nitrium_stollen.de:1521:ZWERGE");
ds.setUser("aufseher");
ds.setPassword("Peitschenknall666");

ctx.bind("java:comp/env/ZwergDBResource_" + ZwergEnv, ds);

//get single connection
Connection conn = ds.getConnection();

//create prepared statement
PreparedStatement pstmt = conn.prepareStatement(sql);

//execute prepared statement in foreign class (simply pstmt.executeUpdate())
DataBaseQuery dbQuery = new DataBaseQuery();
result = Convert.toDouble(dbQuery.execSQLPreparedUpdate(pstmt));

if (dbQuery != null) {
dbQuery.closeResourcesWithoutException();
}

System.out.println("Update Result of Zwergen Update is " + Convert.toString(result));

} catch (Exception e) {
e.printStackTrace();
}

// added Zwerg
assertEquals("Test Result after Update", 1.0, result, 1.0);

}

Jetty

Mal wieder was zur Erinnerung…

Jetty ein Embedded WebServer für Java, der auch (der übliche Weg)direkt aus einer Java Klasse heraus aufgerufen werden kann. Sprich man bekommt für ein paar MB eine Webanwendung samt Webserver 🙂

Hier die notwendigen Schritte, vorausgesetzt man hat Eclipse installiert

1. Ein KOMPlETTES Jetty Repository herunter laden. Das erkennt man an der vorhandenen oder fehlenden start.jar. Z.B von hier
oder jetty-distribution-8.0.4.v20111024

2. In Eclipse ein neues Java Project in Eclipse erstellen. Alles auf Standard lassen. Finish klicken

3.Auf src mit rechts klicken und „New -> Class“ auswählen.Als Package Name z.b „com.trytry“ und als Klassen Name z.B“HelloHandler“. Die muss man sich nur merken und bei behalten, wenn man danach gefragt wird

4. Man klickt auf den Project Namen mit rechts und dann „New -> Folder“, diesen nennt man lib. In diesen kopiert man alle jar Files aus dem lib Verzeichnis des herunter geladenen Jetty zip Files

5. Diese Jar Files macht man dem Project bekannt. In dem man mit rechts auf den Projekt Namen klickt und dann „Properties -> Java Build Path -> Add JARs -> im LIB Verzeichnis alle markieren -> ok -> ok“

6. Muss man einfach die HelloHandler.java in Eclipse durch doppelklicken öffnen und für ein einfaches HalloWorld Programm diesen Code eingeben


package com.trytry;

import java.io.IOException;
import java.net.InetAddress;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class HelloHandler extends AbstractHandler{

public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("

Jetty Server

");
}
public static void main(String[] args) {
int port = 8090;
String IPAddress = "";

try {
Server server = new Server(port);
server.setHandler(new HelloHandler());

InetAddress thisIP = InetAddress.getLocalHost();
IPAddress = thisIP.getHostAddress();
System.out.println("\n Starting Jetty on http://"+ IPAddress + ":" + port + "\n");

server.start();
server.join();

} catch (Exception e) {
e.printStackTrace();
}

}

}

copy+paste sollte funktionieren.

7. Klick auf Projekt in der Menu Leiste dann bei ausgewähltem „Build Automatically“ Clean auswählen und ok beim gewählten Project

8. Jetzt kann man es schon laufen lassen. Klick auf den grünen Run Button und man sollte in der Cosole sehen wie der Jetty zu erreichen ist..
„Starting Jetty on http://192.168.0.100:8090“

9. Jetzt braucht man nur noch einen Browser öffnen und man sollte „Jetty Server“ bei der oben genannten URL sehen

Noch keine richtige Anwendung aber für ein paar MB einen vollständigen Webserver inklusive Anwendung zu bekommen macht zB. im Embedded Bereich vieles möglich

Wie das ganz dann von einer Maschine auf die nächste kopiert wird, ist eine andere Geschichte…man braucht ja noch Projekte 🙂

ANT

dies ist nur mal eine Notitz, weil mich der Einstieg in ANT echt Nerven gekostet hat und die Iteration wohl öfters gebraucht wird
Ant-contribute downloaden und in  $(basedir)/lib/ant-contrib-version.jar ablegen, dann in Build File integrieren

<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="${basedir}/lib/ant-contrib-version.jar"/>
</taskdef>

Liste von z.B xsd Files erstellen und dabei für jedes File eine Funktion aufrufen


<target name="xsd_iteration">
<foreach target="generate_package" param="file">
<path>
<fileset dir="${basedir}/schemaII">
<include name="**/*.xsd" />
</fileset>
</path>
</foreach>
</target>


in der Aufgerufenen Funktion z.B den File Namen benutzen um JAXB laufen zu lassen


<target name="generate_package" description="Generate Packages with Java files">
<basename property="xsdname" file="${file}" suffix=".xsd"/>
<property name="packname" value="com.more-machines.packages.${xsdname}" />

<echo message="Generate package ${packname}" />
<echo message="from ${file}" />

<xjc schema="${file}" destdir="${basedir}/generated" package="${packname}" removeOldOutput="true" />

</target>

Nach oben