diff --git a/ucc/ucc.plugin.karaf/pom.xml b/ucc/ucc.plugin.karaf/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..95c56c57768262384493b6fab38c3640e87c4459 --- /dev/null +++ b/ucc/ucc.plugin.karaf/pom.xml @@ -0,0 +1,95 @@ +<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> diff --git a/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/Activator.java b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/Activator.java new file mode 100644 index 0000000000000000000000000000000000000000..f72dfa774e71304166500bf1b841f86e6e52931e --- /dev/null +++ b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/Activator.java @@ -0,0 +1,73 @@ +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; + } + + +} diff --git a/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/UCCPlugin.java b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/UCCPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..baf9d541cf1acb06a2293d16e7e4e46f5ab87250 --- /dev/null +++ b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/UCCPlugin.java @@ -0,0 +1,56 @@ +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); + } +} diff --git a/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/KarafDeployView.java b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/KarafDeployView.java new file mode 100644 index 0000000000000000000000000000000000000000..3c33ea117c0b99a7c9f65989b45f0bca99b4da29 --- /dev/null +++ b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/KarafDeployView.java @@ -0,0 +1,284 @@ +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()); + } + } +} diff --git a/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/juic/Ui_KarafDeployView.java b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/juic/Ui_KarafDeployView.java new file mode 100644 index 0000000000000000000000000000000000000000..b3c47eab44115ff10756b5d4cdd17224782ac288 --- /dev/null +++ b/ucc/ucc.plugin.karaf/src/main/java/org/universAAL/ucc/plugin/karaf/gui/juic/Ui_KarafDeployView.java @@ -0,0 +1,115 @@ +/******************************************************************************** +** 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 + +} + diff --git a/ucc/ucc.plugin.karaf/src/main/resources/forms/org/universAAL/ucc/plugin/karaf/gui/juic/KarafDeployView.jui b/ucc/ucc.plugin.karaf/src/main/resources/forms/org/universAAL/ucc/plugin/karaf/gui/juic/KarafDeployView.jui new file mode 100644 index 0000000000000000000000000000000000000000..8877da5e3159187e418b550cc4c2045c800ed47c --- /dev/null +++ b/ucc/ucc.plugin.karaf/src/main/resources/forms/org/universAAL/ucc/plugin/karaf/gui/juic/KarafDeployView.jui @@ -0,0 +1,94 @@ +<?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> diff --git a/ucc/ucc.plugin.karaf/src/main/resources/icon/karaf-logo.png b/ucc/ucc.plugin.karaf/src/main/resources/icon/karaf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..066ab8630a6f9bb9280290333a0b10b5f6e8bfa2 Binary files /dev/null and b/ucc/ucc.plugin.karaf/src/main/resources/icon/karaf-logo.png differ diff --git a/ucc/ucc.plugin.karaf/src/main/resources/lib/qtjambi-4.5.2_01.jar b/ucc/ucc.plugin.karaf/src/main/resources/lib/qtjambi-4.5.2_01.jar new file mode 100644 index 0000000000000000000000000000000000000000..745e43c5a9d7cfb10238e668387d811d5420a06e Binary files /dev/null and b/ucc/ucc.plugin.karaf/src/main/resources/lib/qtjambi-4.5.2_01.jar differ