现在的位置: 首页 > 综合 > 正文

《App Factory插件部署功能源代码分析文档》

2017年12月20日 ⁄ 综合 ⁄ 共 5725字 ⁄ 字号 评论关闭

《App Factory插件部署功能源代码分析》
目录
1. 分析目标 ............................................................................................................................. 2
2. 源代码获取 ......................................................................................................................... 2
3. 部署功能的运行原理 ........................................................................................................... 3
3.1 总体运行思路 .......................................................................................................... 3
3.2 功能具体分析 .......................................................................................................... 3
4. 源代码分析 ......................................................................................................................... 4
4.1 分析思路 ................................................................................................................. 4
4.2 具体代码分析 .......................................................................................................... 5
4.2.1 负责界面部分的Bundle ..................................................................................... 5
4.2.2 DeployAction.java .............................................................................................. 5
4.2.3 HttpsJaggeryClient.java ..................................................................................... 7

5. 代码分析总结 ...................................................................................................................... 8


1. 分析目标
通过阅读App Factory在Developer Studio中插件的源代码,联系相应实现的功能,找出如何实现该功能的关键代码,理清代码之间的调用关系,便于对其功能进行重用和扩展。

其中我们重点关注其提供的部署(Deploy)功能。



2. 源代码获取
 在Developer Studio中选择Plug-in Development透视图:
 打开Explorer窗口,点击右侧Plug-ins窗口,即可看见支持整个Developer Studio运行起来的所有底层Bundle。
 找到其中的org.wso2.developerstudio.appfactory.core插件和
org.wso2.developerstudio.appfactory.ui插件,右键选择Import As -> Source Project,将Bundle以源代码形式导入工作区。如下图所示:
 此时导入的工程是无法阅读源代码的。如下图所示:
 需要到WSO2官网(http://wso2.com/products/developer-studio/)下载Developer Studio的源代码(wso2-developer-studio-3.6.0-src.zip),然后在打开类时点击Attach Source进行关联即可。如下图所示:

 已获取到的源代码:



3. 部署功能的运行原理
通过分析点击Deploy按钮后生成的log日志文件,我们可以分析出在该次点击后后台究竟进行了哪些工作。Deploy功能界面如下图所示:
3.1 总体运行思路
该插件Deploy功能主要思路是将所选中的项目的一些信息传递给服务器端的jaggery文件,让这些jaggery文件在服务器端进行处理。
类似于“瘦客户端”模型,通过“传递消息”的方式远程操作云平台中的功能和项目。
3.2 功能具体分析
当点击Deploy按钮后,依次执行了如下操作:
a. 获取上次构建(Build)的id。
b. 从Git代码仓库获取最新代码。
c. 执行一次新的构建(Build)。
d. 部署应用。
e. 获取构建日志并返回。
部署成功后获取构建日志的情况如下图所示:

综上所述,Developer Studio中App Factory插件的Deploy功能实际上实现了网页中App Factory的Build和Deploy功能。如下图所示:



4. 源代码分析
4.1 分析思路
从UI界面开始分析,然后深入理解调用的底层代码。
Deploy按钮界面设置,在未执行open操作时,这个按钮是隐藏的。插件中的扩展设置对应了UI界面的按钮。Deploy按钮的信息设置如下图所示:
该扩展元素详细信息如下图所示:
由上图可知该Deploy操作调用了
org.wso2.developerstudio.appfactory.ui.actions.DeployAction类中的run方法。
所以代码分析从该类开始。
4.2 具体代码分析
4.2.1 负责界面部分的Bundle
Bundle名称:org.wso2.developerstudio.appfactory.ui_1.4.0.jar
此Bundle主要负责Developer Studio中App Factory插件的界面部分代码。
从源代码包命名规则可以看出,App Factory插件主要提供如下几种功能:
 显示App Factory视图:perspective包
 用户登录界面:LoginAction.java
 配置界面:AppFactoryPreferencePage.java
 应用程序详细信息显示界面:AppfactoryApplicationDetailsView.java
 应用程序列表显示界面:AppfactoryApplicationListView.java
4.2.2 DeployAction.java
因为本文主要关注部署功能的实现,所以从DeployAction.java类作为入口开始研究。
该类所属包为:package org.wso2.developerstudio.appfactory.ui.actions;
 获取一个应用程序列表对象:
AppfactoryApplicationListView applist = (AppfactoryApplicationListView) findView;
 获取用户选中的项目:
private IStructuredSelection selection;
IProject project = (IProject)selection.getFirstElement();
 获取Maven中项目
File pomfile = project.getFile("pom.xml").getLocation().toFile();
MavenProject mavenProject = MavenUtils.getMavenProject(pomfile);
 获取该项目一些信息,并保存在map映射中。
final Map<String, String> params = new HashMap<String, String>();
params.put("action",JagApiProperties.App_BUILD_ACTION);
params.put("stage", "Development");
params.put("applicationKey", mavenProject.getArtifactId());
String version =mavenProject.getVersion();
if("SNAPSHOT".equals(version)){version = "trunk";}
params.put("version", version);
params.put("doDeploy", "true");
 该类中关键代码如下:
该行代码调用了HttpsJaggeryClient中的httpPost方法。
根据DeployAction.java中的此调用,研究传递给httpPost方法的形参urlStr对应的实参:JagApiProperties.getBuildApplication()。
JagApiProperties.getBuildApplication()位于org.wso2.developerstudio.appfactory.core.jag.api包中。如下图所示:
通过查阅该类可知此调用返回的字符串为https://appfactory.cloudpreview.wso2.com/appmgt/site/blocks/lifecycle/add/ajax/add.jag
类似的,如下图所示的界面的URL为https://appfactory.cloudpreview.wso2.com/appmgt/site/pages/governance.jag?applicationName=WebAppTwo&applicationKey=webapptwo
了解URL的构成有利于对后台代码的研究。
4.2.3 HttpsJaggeryClient.java
该类所在的位置,如下图所示
从以下部分依赖的WSO2包可以看出此类中调用了哪些WSO2其他类的功能。
package org.wso2.developerstudio.appfactory.core.client;
import org.wso2.developerstudio.appfactory.core.Activator;
import org.wso2.developerstudio.appfactory.core.authentication.Authenticator;
import org.wso2.developerstudio.appfactory.core.model.ErrorType;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
首先,转换客户端类型:
return new DefaultHttpClient(ccm, base.getParams());
其次,httpPost方法:
 创建Http客户端:
private static HttpClient client;
 获取HttpPost对象,用于传输数据:
HttpPost post = new HttpPost(urlStr);
 设置post对象内容:
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 获取返回消息:(此处属于关键执行处)
response = client.execute(post);
该方法调用一些底层的Http传输操作。具体定义在HttpResponse org.apache.http.client.HttpClient.execute(HttpUriRequest arg0) throws IOException, ClientProtocolException)
该基础类的源代码文件:httpclient-4.3.1-sources.jar(grepcode.com中可找到源代码)
 对返回消息的操作:
if(200==response.getStatusLine().getStatusCode()){
HttpEntity entityGetAppsOfUser = response.getEntity();
BufferedReader rd = new BufferedReader(new InputStreamReader(entityGetAppsOfUser.getContent()));
StringBuilder sb = new StringBuilder();
String line ="";
while ((line = rd.readLine()) != null) {sb.append(line);}

respond = sb.toString();



5. 代码分析总结
该插件的部署功能主要通过向服务器传递信息,然后在服务器端进行主要工作的实施。
主要传递两个参数:一是服务器端负责处理该请求的文件的URL。二是Developer Studio中选中的项目的详细信息,以便在服务器端准确处理该项目。

抱歉!评论已关闭.