Skip to content
Snippets Groups Projects
Commit 9c4261b0 authored by Shanshan Jiang's avatar Shanshan Jiang
Browse files

First implementation

parent 26e2e22d
No related branches found
No related tags found
No related merge requests found
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.universAAL.tools.ucc</groupId>
<artifactId>ucc.plugin.karaf</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>UCC Karaf Deploy plugin for Karaf</name>
<description>The deployment plugin for Karaf</description>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.core</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.universAAL.middleware</groupId>
<artifactId>mw.data.representation</artifactId>
<version>1.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.universAAL.tools.ucc</groupId>
<artifactId>ucc.api</artifactId>
<version>1.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.universAAL.tools.ucc</groupId>
<artifactId>ucc.viewjambi</artifactId>
<version>1.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.sf.qtjambi</groupId>
<artifactId>qtjambi</artifactId>
<version>4.5.2_01</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Name>${project.name}</Bundle-Name>
<Bundle-Activator>org.universAAL.ucc.plugin.karaf.Activator</Bundle-Activator>
<Bundle-Description>${project.description}</Bundle-Description>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>central</id>
<name>Central Maven Repository</name>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>apache-snapshots</id>
<name>Apache Snapshots</name>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<updatePolicy>daily</updatePolicy>
</snapshots>
</repository>
<repository>
<id>uaal</id>
<name>universAAL Repositories</name>
<url>http://depot.universaal.org/maven-repo/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>uaal-snapshots</id>
<name>universAAL Snapshot Repositories</name>
<url>http://depot.universaal.org/maven-repo/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>qtjambi</id>
<name>qtjambi</name>
<url>http://qtjambi.sourceforge.net/maven2/</url>
</repository>
</repositories>
</project>
package org.universAAL.ucc.plugin.karaf;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.universAAL.ucc.api.core.IInformation;
import org.universAAL.ucc.api.plugin.IPluginBase;
import com.trolltech.qt.QThread;
/**
*
* @author shanshan
* @version 1.0
* @created 14.05.2012
*
*/
public class Activator implements BundleActivator {
public static BundleContext context=null;
private static int max_retry = 10;
static UCCPlugin uCCPlugin = null;
static IPluginBase uCCPluginBase = null;
static IInformation information = null;
public static IInformation getInformation() {
return Activator.information;
}
public void start(BundleContext context) throws Exception {
Activator.context=context;
System.out.println("Karaf plugin Activator started!");
Activator.uCCPluginBase = (IPluginBase) this.getServiceObject(context, IPluginBase.class.getName());
Activator.information = (IInformation) this.getServiceObject(context, IInformation.class.getName());
new QThread(new Runnable () {
public void run() {
if (Activator.uCCPluginBase != null && information != null) {
Activator.uCCPlugin = new UCCPlugin(Activator.uCCPluginBase);
Activator.uCCPluginBase.registerPlugin(Activator.uCCPlugin);
//Activator.uCCPlugin.createGridViewItem();
System.out.println("Karaf Plugin started!");
}
else {
if (Activator.uCCPluginBase == null)
System.err.println("Can not start Karaf-view: Do not found Plugin-Base!");
if (Activator.information == null)
System.err.println("Can not start Karaf-view: Do not found Information Service!");
}
}
}).start();
}
public void stop(BundleContext arg0) throws Exception {
}
private Object getServiceObject(BundleContext context, String name) throws Exception {
ServiceReference sr = null;
int retry_count = 0;
while (sr == null && retry_count<max_retry) {
sr = context.getServiceReference(name);
if (sr == null)
Thread.sleep(1000);
retry_count++;
}
if (sr != null)
return context.getService(sr);
return null;
}
}
package org.universAAL.ucc.plugin.karaf;
import org.universAAL.ucc.api.plugin.IPlugin;
import org.universAAL.ucc.api.plugin.IPluginBase;
import org.universAAL.ucc.api.plugin.PluginGridViewItem;
import org.universAAL.ucc.api.plugin.PluginMenu;
import org.universAAL.ucc.plugin.karaf.gui.KarafDeployView;
/**
*
* @author shanshan
* @version 1.0
* @created 14.05.2012
*
*
*/
public class UCCPlugin implements IPlugin {
private PluginMenu menu = new PluginMenu("Plugin Karaf");
private KarafDeployView karafView = null;
private IPluginBase uCCPluginBase = null;
public UCCPlugin(IPluginBase uCCPluginBase) {
this.uCCPluginBase = uCCPluginBase;
createMenu();
createGridViewItem();
}
public void registerViews() {
uCCPluginBase.addMenu(menu);
karafView = new KarafDeployView(uCCPluginBase);
uCCPluginBase.getMainView().hideSubWindow(karafView);
}
public void createMenu() {
menu.addEntry("Deploy To Karaf", new Runnable() {
public void run() {
uCCPluginBase.getMainView().showSubWindow(karafView);
}
});
}
public void createGridViewItem(){
PluginGridViewItem gv= new PluginGridViewItem("Deploy To\nKaraf", "addressbook2.png", new Runnable() {
public void run() {
uCCPluginBase.getMainView().showSubWindow(karafView);
}
});
uCCPluginBase.addGridItem(gv);
}
}
package org.universAAL.ucc.plugin.karaf.gui;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.universAAL.ucc.api.plugin.IPluginBase;
import org.universAAL.ucc.plugin.karaf.gui.juic.Ui_KarafDeployView;
import org.universAAL.ucc.viewjambi.common.SubWindow;
import com.trolltech.qt.core.QDir;
import com.trolltech.qt.gui.*;
/**
* This file deploys an application downloaded as .uaal to local Karaf
* It uses many methods (and modified accordingly) from ucc.core.installer
*
* @author shanshan
*
*/
public class KarafDeployView extends SubWindow {
private static Ui_KarafDeployView karaf_base = new Ui_KarafDeployView();
private IPluginBase uCCPluginBase = null;
public KarafDeployView(IPluginBase uCCPluginBase) {
super(KarafDeployView.karaf_base);
this.uCCPluginBase = uCCPluginBase;
karaf_base.pushButton_karaf.clicked.connect(this,"getKarafPath()");
karaf_base.pushButton_app.clicked.connect(this, "getAppFile()");
karaf_base.pushButton_ok.clicked.connect(this, "deployToKaraf()");
karaf_base.pushButton_cancel.clicked.connect(this, "cancel()");
}
protected void getKarafPath() {
System.out.println("getting karaf installation path...");
String directory = QFileDialog.getExistingDirectory(this,
"karaf installation path", QDir.currentPath());
if (!directory.equals("")) {
karaf_base.lineEdit_karaf.setText(directory);
System.out.println("karaf installation path: " + karaf_base.lineEdit_karaf.text());
}
}
protected void getAppFile() {
System.out.println("getting application installation file (.uaal)");
QFileDialog dialog = new QFileDialog(this, "Please choose a file to install!", ".", "universAAL (*.uaal)");
int result = dialog.exec();
if (result == QDialog.DialogCode.Accepted.value()) {
String file = dialog.selectedFiles().get(0);
if (file != null)
karaf_base.lineEdit_app.setText(file);
System.out.println("application to be installed: " + karaf_base.lineEdit_app.text());
}
}
protected void deployToKaraf() {
System.out.println("Deploying to Karaf started");
String karafPath = karaf_base.lineEdit_karaf.text();
karafPath = karafPath.replace("/", "\\");
String p=karaf_base.lineEdit_app.text();
p=p.replace("/", "\\");
try {
String appDir = deployApplication(karafPath,p);
QMessageBox.information(this, "Karaf deployment", "Deployment to Karaf has been successfully completed!");
this.uCCPluginBase.getMainView().hideSubWindow(this);
} catch (NullPointerException e){
QMessageBox.critical(this, "Error", "Deployment failed! The Application probably already is installed!");
} catch (Exception e) {
QMessageBox.critical(this, "Error", e.getMessage());
this.uCCPluginBase.getMainView().hideSubWindow(this);
}
}
protected void cancel() {
System.out.println("Cancel button is pressed");
this.uCCPluginBase.getMainView().removeSubWindow(this);
}
/**
* deploy the application appP to karafP
* @param karafP
* @param appP
* @return
* @throws Exception
*/
private String deployApplication(String karafP, String appP) throws Exception {
// TODO: check if the application installation file is valid, i.e., the .uaal file
// unzip the .uaal file, put
System.out.println("[deployApplication] karaf path: " + karafP + "; app path: "+ appP);
String exdir=extractBundles(karafP, appP);
if (exdir==null) throw new Exception("Error extracting uaal Package");
System.out.println("[karaf] the application files are extracted under " + exdir);
File appDir=new File(exdir);
checkApplicationForInstall(appDir);
String[] bundlelist=appDir.list();
for(int i=0;i<bundlelist.length;i++){
if(bundlelist[i].endsWith(".jar")){
// copy .jars to /deploy folder
String dPath = karafP + "\\deploy";
System.out.println("copy " + bundlelist[i] + " to " + dPath);
File inFile = new File(appDir, bundlelist[i]);
File outFile = new File(dPath, bundlelist[i]);
//copyfile(inFile, outFile);
copy(inFile, outFile);
}
if (bundlelist[i].endsWith(".cfg")){
// copy .cfgs to /etc folder
String cPath = karafP + "\\etc";
System.out.println("copy " + bundlelist[i] + " to " + cPath);
File inFile = new File(appDir, bundlelist[i]);
File outFile = new File(cPath, bundlelist[i]);
//copyfile(inFile, outFile);
copy(inFile, outFile);
}
}
return exdir;
}
/**
* Is bundle valid? All need files available? Dependencies to check and all
* right? Check if concrete instances available (but how)?
*
* TODO: If we use features descriptor, then check this. To be updated...
*
* @param Path
* @throws Exception
*/
private void checkApplicationForInstall(File folder) throws Exception {
String[] content = folder.list();
boolean jarok=false;
boolean configok=false;
boolean eulaok=false;
for(int i=0;i<content.length;i++){
if(content[i].endsWith(".jar")) jarok=true;
//if(content[i].equals("config.owl")) configok=true;
if(content[i].equals("EULA.txt")) eulaok=true;
}
if(!jarok) throw new Exception("There is no installable jar File in uaal Package!");
//if(!configok) throw new Exception("config.owl file not found!");
//if(!eulaok) throw new Exception("No License agreement found!");
}
private String extractBundles(String karafPath, String path) {
String destDir = path.substring(path.lastIndexOf(File.separator) + 1,path.lastIndexOf("."));
destDir = karafPath +"\\"+ destDir;
File appDir=new File(destDir);
int suffix=1;
int slength=0;
while(appDir.exists()){
destDir=destDir.substring(0, destDir.length()-slength)+suffix;
slength=(suffix+"").length();
appDir=new File(destDir);
suffix++;
}
appDir.mkdir();
try {
extractFolder(path, destDir);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return destDir;
}
static public void extractFolder(String zipFile, String destdir) throws ZipException, IOException
{
System.out.println(zipFile);
int BUFFER = 2048;
File file = new File(zipFile);
ZipFile zip = new ZipFile(file);
String newPath = destdir;
new File(newPath).mkdir();
Enumeration zipFileEntries = zip.entries();
// Process each entry
while (zipFileEntries.hasMoreElements())
{
// grab a zip file entry
ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
String currentEntry = entry.getName();
File destFile = new File(newPath, currentEntry);
//destFile = new File(newPath, destFile.getName());
File destinationParent = destFile.getParentFile();
// create the parent directory structure if needed
destinationParent.mkdirs();
if (!entry.isDirectory())
{
BufferedInputStream is = new BufferedInputStream(zip
.getInputStream(entry));
int currentByte;
// establish buffer for writing file
byte data[] = new byte[BUFFER];
// write the current file to disk
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream dest = new BufferedOutputStream(fos,
BUFFER);
// read and write until last byte is encountered
while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
is.close();
}
}
}
public boolean copy(File inputFile, File outputFile) {
try {
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
} catch (Exception e) {
return false;
}
return true;
}
private void copyfile(File f1, File f2){
try{
//File f1 = new File(srFile);
//File f2 = new File(dtFile);
InputStream in = new FileInputStream(f1);
//For Append the file.
// OutputStream out = new FileOutputStream(f2,true);
//For Overwrite the file.
OutputStream out = new FileOutputStream(f2);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
in.close();
out.close();
System.out.println("File copied.");
}
catch(FileNotFoundException ex){
System.out.println(ex.getMessage() + " in the specified directory.");
System.exit(0);
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
}
/********************************************************************************
** Form generated from reading ui file 'KarafDeployView.jui'
**
** Created: on 16. mai 11:11:05 2012
** by: Qt User Interface Compiler version 4.5.2
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/
package org.universAAL.ucc.plugin.karaf.gui.juic;
import com.trolltech.qt.core.*;
import com.trolltech.qt.gui.*;
public class Ui_KarafDeployView implements com.trolltech.qt.QUiForm<QWidget>
{
public QVBoxLayout verticalLayout;
public QGridLayout gridLayout;
public QLabel label;
public QLineEdit lineEdit_karaf;
public QPushButton pushButton_karaf;
public QGridLayout gridLayout_2;
public QLabel label_2;
public QLineEdit lineEdit_app;
public QPushButton pushButton_app;
public QGridLayout gridLayout_3;
public QPushButton pushButton_ok;
public QPushButton pushButton_cancel;
public QSpacerItem horizontalSpacer;
public Ui_KarafDeployView() { super(); }
public void setupUi(QWidget KarafDeployView)
{
KarafDeployView.setObjectName("KarafDeployView");
KarafDeployView.resize(new QSize(600, 202).expandedTo(KarafDeployView.minimumSizeHint()));
verticalLayout = new QVBoxLayout(KarafDeployView);
verticalLayout.setObjectName("verticalLayout");
gridLayout = new QGridLayout();
gridLayout.setObjectName("gridLayout");
label = new QLabel(KarafDeployView);
label.setObjectName("label");
gridLayout.addWidget(label, 0, 0, 1, 1);
lineEdit_karaf = new QLineEdit(KarafDeployView);
lineEdit_karaf.setObjectName("lineEdit_karaf");
gridLayout.addWidget(lineEdit_karaf, 0, 1, 1, 1);
pushButton_karaf = new QPushButton(KarafDeployView);
pushButton_karaf.setObjectName("pushButton_karaf");
gridLayout.addWidget(pushButton_karaf, 0, 2, 1, 1);
verticalLayout.addLayout(gridLayout);
gridLayout_2 = new QGridLayout();
gridLayout_2.setObjectName("gridLayout_2");
label_2 = new QLabel(KarafDeployView);
label_2.setObjectName("label_2");
gridLayout_2.addWidget(label_2, 0, 0, 1, 1);
lineEdit_app = new QLineEdit(KarafDeployView);
lineEdit_app.setObjectName("lineEdit_app");
gridLayout_2.addWidget(lineEdit_app, 0, 1, 1, 1);
pushButton_app = new QPushButton(KarafDeployView);
pushButton_app.setObjectName("pushButton_app");
gridLayout_2.addWidget(pushButton_app, 0, 2, 1, 1);
verticalLayout.addLayout(gridLayout_2);
gridLayout_3 = new QGridLayout();
gridLayout_3.setObjectName("gridLayout_3");
pushButton_ok = new QPushButton(KarafDeployView);
pushButton_ok.setObjectName("pushButton_ok");
gridLayout_3.addWidget(pushButton_ok, 0, 1, 1, 1);
pushButton_cancel = new QPushButton(KarafDeployView);
pushButton_cancel.setObjectName("pushButton_cancel");
gridLayout_3.addWidget(pushButton_cancel, 0, 2, 1, 1);
horizontalSpacer = new QSpacerItem(40, 20, com.trolltech.qt.gui.QSizePolicy.Policy.Expanding, com.trolltech.qt.gui.QSizePolicy.Policy.Minimum);
gridLayout_3.addItem(horizontalSpacer, 0, 0, 1, 1);
verticalLayout.addLayout(gridLayout_3);
retranslateUi(KarafDeployView);
KarafDeployView.connectSlotsByName();
} // setupUi
void retranslateUi(QWidget KarafDeployView)
{
KarafDeployView.setWindowTitle(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Karaf Deploy Window", null));
label.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Karaf Installation Path", null));
pushButton_karaf.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Browse...", null));
label_2.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Application To Be Installed", null));
pushButton_app.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Browse...", null));
pushButton_ok.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "OK", null));
pushButton_cancel.setText(com.trolltech.qt.core.QCoreApplication.translate("KarafDeployView", "Cancel", null));
} // retranslateUi
}
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0" language="jambi">
<class>KarafDeployView</class>
<widget class="QWidget" name="KarafDeployView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>202</height>
</rect>
</property>
<property name="windowTitle">
<string>Karaf Deploy Window</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Karaf Installation Path</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_karaf"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton_karaf">
<property name="text">
<string>Browse...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Application To Be Installed</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_app"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton_app">
<property name="text">
<string>Browse...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="1">
<widget class="QPushButton" name="pushButton_ok">
<property name="text">
<string>OK</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton_cancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>com.trolltech.qt.core.Qt.Orientation.Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
ucc/ucc.plugin.karaf/src/main/resources/icon/karaf-logo.png

20.2 KiB

File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment