当前位置: 编程技术>移动开发
本页文章导读:
▪冲破,Objective-C开发速学手册 突破,Objective-C开发速学手册
《突破,Objective-C开发速学手册》
基本信息
作者: 傅志辉
出版社:电子工业出版社
ISBN:9787121207426
上架时间:2013-7-12
出版日期:2013 年8月
开本:16开
页码:3.........
▪ 毋庸编码创建app-应用之星制作app教程 无需编码创建app--应用之星制作app教程
[size=medium]目前在AppStore、GooglePlay等应用商店里已经有以百万计的Apps,应用程序使移动互联网空间得以无限拓展。很多人梦想着AngryBirds式的奇迹在自己.........
▪ openfire批改程序,使得在同一个分组里的用户,自动和该组admin互为好友 openfire修改程序,使得在同一个分组里的用户,自动和该组admin互为好友
openfire修改程序,使得在同一个分组里的用户,自动和该组admin互为好友,另外当把用户从组里删除时,自动删除和admi.........
[1]冲破,Objective-C开发速学手册
来源: 互联网 发布时间: 2014-02-18
突破,Objective-C开发速学手册
《突破,Objective-C开发速学手册》
基本信息
作者: 傅志辉
出版社:电子工业出版社
ISBN:9787121207426
上架时间:2013-7-12
出版日期:2013 年8月
开本:16开
页码:392
版次:1-1
所属分类:计算机 > 软件与程序设计 > 综合 > 高级程序语言设计
更多关于 》》》《突破,Objective-C开发速学手册》
内容简介
计算机书籍
《突破,objective-c开发速学手册(含cd光盘1张)》由浅入深,全面、系统地介绍了objective-c开发技术。本书最大的特色就是提供了大量的插图,一改过去编程书籍只有枯燥乏味的文字讲解,利用各种说明插图和运行结果示意图,生动形象地再现了objective-c开发需要的所有知识,使读者能够轻松地掌握学习内容。另外,作者专门为每一章编写了一些习题,以便读者对该章的学习水平进行检测。
《突破,objective-c开发速学手册(含cd光盘1张)》涉及面广,从基础的理论到语法,再到高级的应用,几乎涉及objective-c语言的所有重点知识。本书适合想全面学习objective-c语言的人员阅读,也适合各种使用objective-c语言进行开发的工程技术人员使用。对经常使用objective-c语言进行开发的人员,更是一本不可多得的案头必备参考书。
目录
《突破,objective-c开发速学手册(含cd光盘1张)》
第一篇 基础篇
第1章 第一个objective-c程序2
1.1 objective-c开发概述2
1.1.1 objective-c的发展史2
1.1.2 objective-c的特点3
1.2 构建开发环境4
1.2.1 objective-c开发环境的安装条件4
1.2.2 virtualbox下载和安装5
1.2.3 虚拟机的建立7
1.2.4 设置虚拟机10
1.2.5 安装系统11
1.2.6 进入界面11
1.2.7 下载和安装xcode16
1.3 “hello world!”程序20
1.3.1 创建hello objective-c项目20
1.3.2 编译、链接及运行22
1.4 objective-c代码认识24
1.4.1 查看源文件24
1.4.2 objective-c程序的结构25
.1.4.3 注释25
1.4.4 标识符26
1.5 小结28
1.6 习题28
第2章 数据类型30
2.1 数30
2.1.1 二进制数30
2.1.2 十进制数31
2.1.3 八进制数32
2.1.4 十六进制数33
2.1.5 各进制之间的转换34
2.2 数据类型34
2.2.1 整数类型34
2.2.2 实型数据36
2.2.3 字符型37
2.2.4 数据类型的输出40
2.2.5 objective-c特有的数据类型40
2.3 变量和常量40
2.3.1 变量41
2.3.2 常量43
2.4 小结45
2.5 习题45
第3章 语句48
3.1 语句的构成48
3.2 运算符及表达式49
3.2.1 算术运算符及表达式49
3.2.2 自增自减运算符51
3.2.3 位运算符52
3.2.4 赋值运算符及表达式55
3.2.5 关系运算符及表达式59
3.2.6 条件运算符60
3.2.7 布尔逻辑运算符及表达式62
3.2.8 逗号运算符及表达式64
3.2.9 求字节数运算符65
3.2.10 特殊的运算符66
3.2.11 运算符的优先级67
3.3 类型转换69
3.3.1 自动转换69
3.3.2 强制类型转换71
3.4 语句块72
3.4.1 语句块的结构72
3.4.2 作用域73
3.5 小结74
3.6 习题74
第4章 程序控制结构77
4.1 顺序结构77
4.2 选择结构78
4.2.1 条件语句的组成78
4.2.2 if语句79
4.2.3 if...else语句80
4.2.4 if...else...if语句82
4.2.5 三种if语句的注意事项84
4.2.6 if语句的嵌套86
4.2.7 switch语句87
4.3 循环结构90
4.3.1 while语句91
4.3.2 for语句92
4.3.3 do...while语句97
4.3.4 三种循环语句的比较98
4.4 转折语句99
4.4.1 break语句99
4.4.2 continue101
4.4.3 break和continue的比较101
4.4.4 return语句102
4.5 小结102
4.6 习题103
第5章 函数105
5.1 函数简介105
5.2 函数的使用107
5.2.1 函数的声明107
5.2.2 函数的定义和调用107
5.2.3 函数使用中的问题109
5.2.4 空函数110
5.3 函数的参数111
5.3.1 参数111
5.3.2 有参函数的定义和调用112
5.3.3 参数的注意事项113
5.3.4 函数的传递方式114
5.4 函数的返回值115
5.4.1 返回某一数据类型的值115
5.4.2 无返回值117
5.5 函数的嵌套和递归117
5.5.1 函数的嵌套117
5.5.2 函数的递归119
5.6 小结120
5.7 习题120
第二篇 面向对象篇
第6章 面向对象编程124
6.1 类和对象124
6.1.1 类的声明和定义124
6.1.2 实例化对象126
6.2 实例变量130
6.2.1 实例变量的定义130
6.2.2 实例变量的使用130
6.2.3 实例变量、全局变量和局部变量的区别131
6.2.4 变量的存储类别132
6.3 方法135
6.3.1 方法的声明135
6.3.2 方法的实现136
6.3.3 对象方法的使用136
6.3.4 类方法的使用138
6.3.5 方法的参数139
6.4 属性142
6.4.1 属性的声明和定义142
6.4.2 带参属性144
6.4.3 带参属性——setter/getter方法(assign/retain/copy)144
6.4.4 带参属性——读写属性148
6.4.5 带参属性——原子修饰149
6.5 小结150
6.6 习题150
第7章 深入面向对象的编程154
7.1 继承154
7.1.1 继承的实现154
7.1.2 实例变量的继承155
7.1.3 方法的继承158
7.2 访问限定符159
7.2.1 @public159
7.2.2 @protected161
7.2.3 @private161
7.2.4 访问限定符的区别162
7.3 方法重写163
7.3.1 方法重写的形式163
7.3.2 super164
7.4 方法重载165
7.5 多层继承166
7.6 多态169
7.6.1 多态的形式169
7.6.2 方法的重写实现多态170
7.6.3 方法的重载实现多态171
7.7 动态类型和动态绑定172
7.7.1 动态类型id172
7.7.2 动态绑定173
7.8 小结174
7.9 习题174
第8章 分类和协议180
8.1 分类180
8.1.1 分类的声明180
8.1.2 分类的定义180
8.1.3 分类的使用181
8.1.4 分类的创建181
8.1.5 分类使用的注意点183
8.2 协议185
8.2.1 协议的定义185
8.2.2 协议的创建186
8.2.3 协议在类中的声明187
8.2.4 所用协议声明方法187
8.2.5 关键字188
8.2.6 多个协议的使用192
8.2.7 在协议中使用协议193
8.2.8 判断协议实现的方法194
8.2.9 协议的分类195
8.3 小结196
8.4 习题196
第三篇 技术篇
第9章 内存管理200
9.1 内存管理的基础200
9.1.1 申请内存(alloc)200
9.1.2 释放内存(dealloc)201
9.2 引用计数204
9.2.1 引用计数和字符串205
9.2.2 引用计数和实例变量206
9.3 自动释放池207
9.3.1 自动释放池207
9.3.2 建立多个自动释放池209
9.3.3 引用计数和自动释放池210
9.4 内存管理规则及内存泄漏211
9.4.1 内存管理规则211
9.4.2 内存泄漏213
9.5 垃圾回收213
9.6 小结214
9.7 习题214
第10章 foundation框架的基本对象217
10.1 数字对象217
10.1.1 数字对象的介绍217
10.1.2 数字对象的使用218
10.2 字符串对象224
10.2.1 字符串和字符的区别224
10.2.2 不可修改的字符串225
10.2.3 可修改的字符串232
10.3 数组对象235
10.3.1 数组的定义235
10.3.2 数组的声明235
10.3.3 数组的引用237
10.3.4 二维数组的声明和定义238
10.3.5 二维数组初始化的方法239
10.3.6 二维数组的引用240
10.3.7 字符数组的含义241
10.3.8 字符数组初始化241
10.3.9 字符数组的引用241
10.3.10 不可修改的数组242
10.3.11 可修改的数组246
10.4 字典对象251
10.4.1 不可修改的字典251
10.4.2. 可修改的字典253
10.5 集合对象256
10.5.1 不可修改的集合257
10.5.2 可修改的集合259
10.6 小结263
10.7 习题263
第11章 文件和目录处理267
11.1 文件的操作267
11.1.1 创建文件267
11.1.2 文件的使用268
11.1.3 对文件数据的操作274
11.1.4 文件的读写278
11.2 目录的操作286
11.2.1 目录的基本操作方法286
11.2.2 目录的显示289
11.2.3 临时目录292
11.2.4 路径293
11.3 小结294
11.4 习题294
第12章 编译预处理296
12.1 宏定义296
12.1.1 不带参宏定义296
12.1.2 带参宏297
12.1.3 使用宏的注意点298
12.1.4 宏的取消299
12.2 文件包含301
12.3 条件编译304
12.3.1 #ifdef304
12.3.2 #ifndef305
12.3.3 #if307
12.3.4 编译预处理总结307
12.4 小结308
12.5 习题308
第13章 进程和线程312
13.1 进程312
13.1.1 创建进程312
13.1.2 进程的使用313
13.1.3 进程方法总结315
13.2 线程315
13.2.1 使用nsthread创建线程316
13.2.2 启动线程316
13.2.3 访问主线程318
13.3 互斥锁318
13.3.1 nslock319
13.3.2 @synchronized320
13.4 进程和线程的区别321
13.5 小结322
13.6 习题322
第14章 归档324
14.1 xml属性列表324
14.1.1 使用xml进行数据保存324
14.1.2 使用xml进行数据读取326
14.2 nskeyedarchiver329
14.2.1 nskeyedarchive的数据保存330
14.2.2 nskeyedarchive的数据读取331
14.3 编码和解码方法331
14.3.1 直接进行归档332
14.3.2 编码方法333
14.3.3 解码方法333
14.4 保存多个对象到一个文件335
14.5 使用归档程序复制对象337
14.6 小结337
14.7 习题338
第15章 错误处理341
15.1 错误的分类341
15.2 使用返回值342
15.3 使用异常处理342
15.3.1 异常处理的使用343
15.3.2 捕获不同类型的异常345
15.3.3 使用异常的注意点346
15.3.4 抛出异常348
15.4 使用nserror349
15.5 小结350
15.6 习题351
第16章 时间日期处理352
16.1 nsdate352
16.1.1 创建nsdate352
16.1.2 获取当前的日期353
16.1.3 获取昨天的日期353
16.1.4 日期的比较355
16.1.5 两个日期的时间差358
16.1.6 时间间隔358
16.2 使用nscalendar359
16.2.1 创建一个给定日期的nsdate对象359
16.2.2 日期在不同日历间的转换361
16.2.3 获取日期总的年月日361
16.3 字符串和日期的相互转化362
16.3.1 将日期转化为字符串362
16.3.2 将字符串转化为日期363
16.4 时区365
16.5 小结366
16.6 习题366
第四篇 iphone开发入门篇
第17章 iphone入门370
17.1 iphone简介370
17.1.1 iphone的发展370
17.1.2 编写iphone应用程序和其他程序的不同371
17.2 第一个“hello world!”程序371
17.2.1 创建hello world项目371
17.2.2 iphone simulator的简介371
17.2.3 使用interface builder373
17.2.4 编写第一个“hello world!”程序376
17.3 小结378
本图书信息来源:互动出版网
[2] 毋庸编码创建app-应用之星制作app教程
来源: 互联网 发布时间: 2014-02-18
无需编码创建app--应用之星制作app教程
[size=medium]目前在AppStore、GooglePlay等应用商店里已经有以百万计的Apps,应用程序使移动互联网空间得以无限拓展。很多人梦想着AngryBirds式的奇迹在自己身上发生,他们渴望自己开发的应用程序能够一夜暴红。你是不是也像笔者一样虽然不指望能一夜爆红,但也希望自己鼓捣一个小App呢?
我想很多人可能都希望自己可以做一款app,但是苦于不会编程而作罢。不过最近笔者推荐“应用之星”的网站,可以免费创建自己的App,无需任何编程知识,只需几分钟的简单操作就可以完成。
通过官网的简单了解我们可以得到以下信息:无需任何编码技术,用户可以免费创建自己的App,可以通过应用之星提供的个人中心可以实现对内容的管理,编辑、发布、修改,并且还能监测到应用的下载情况,同时也能跟踪到应用的收益情况。如果App做的良好的话,应用之星将会提交到安卓市场,比如移动MM市场等等。是不是真的有这么神奇的工具存在,笔者带大家一起来一次实战操作:
创建自己的APP
在网页上创建App的流程操作非常简单。
首先:需要登陆应用之星网站(www.appstar.com.cn)注册账号并激活。
其次:登录账号,点击“应用制作”,弹出的窗口你将看到“我的应用”,“我的模板”和“系统模板”。大家根据需要自行选择。
下面介绍的是直接制作应用,不利用系统模板了。
再次:点击“添加应用”,弹出的页面你将看到“页面”和“控件”。
点击“页面”你将看到新增页面,每个新增的页面可以编辑修改;点击“控件”你将看到8个控件,包括按钮控件,标签控件,图片控件,浏览器控件,视频控件,音频控件,媒体控件和RSS控件。每个控件都可以自定义,自主发挥你的创意。
有几点需要注意:
1. 根据你的应用选择对应的控件,然后将控件拖入左边的编辑框。
2. 坐标是用来控制每个控件之间的整齐,比如上下对齐,左右对齐。
3. 当控件拖入坐标的编辑框后,可以右击控件,出现“复制”,“粘贴”,“删除”等功能,方便操作。
4. 对控件的名称编辑在文本框内编辑修改。
5. 在应用制作过程中要记得“保存”,以免不当的操作导致之前做的丢失。
6. 菜单栏上面的“新建”按钮可以直接打开“我的应用”。
7. 当一个页面做完后,在做另外一个页面,点击“页面”-“新增页面”即可,每个页面名称和属性都可以自定义。
8. 当做第二页面时,可以直接复制第一个页面,如果是类似的页面,复制的目的是节省时间,减少重复操作。
第四:等所有页面都完成后,接下来是“流程设置”,按钮在菜单栏上,注意看哈。
所谓的流程设置,就是设置“起始页”到“目标页”之间的关系,比如想让“首页”跳转到“目录”,那就先点击起始页里面的“首页”,然后再点击目标页的“目录”。最后保存退出。
第五:如果你想在应用里嵌入广告,那么接着点击“应用设置”里的“广告设置”,广告设置非常简单,按提示操作即可。
第六:在发布之前你也可以预览一下应用,点击菜单栏上面的“预览”按钮即可在线预览,如果满意自己做的应用,那么接下来就可以生成应用了。
当这些简单的工作都完成之后,恭喜你,你已经制作出了属于自己的App,系统会生成此app二种下载方式,可以下载到电脑,也可以二维码扫描下载到手机。
第七:当然如果你想分享给更多的人使用你的app,那么你就要选择发布应用,应用发布和应用的修改都是是在个人中心。应用发布后,要等待管理员的审核,一般在一个工作日内被审核,具体审核状态可以在个人中心里查询。
第八:笔者最想告诉大家的是平台上面的“一键电子书”和“一键淘宝”更容易操作,而且非常快速。[/size]
[size=medium]目前在AppStore、GooglePlay等应用商店里已经有以百万计的Apps,应用程序使移动互联网空间得以无限拓展。很多人梦想着AngryBirds式的奇迹在自己身上发生,他们渴望自己开发的应用程序能够一夜暴红。你是不是也像笔者一样虽然不指望能一夜爆红,但也希望自己鼓捣一个小App呢?
我想很多人可能都希望自己可以做一款app,但是苦于不会编程而作罢。不过最近笔者推荐“应用之星”的网站,可以免费创建自己的App,无需任何编程知识,只需几分钟的简单操作就可以完成。
通过官网的简单了解我们可以得到以下信息:无需任何编码技术,用户可以免费创建自己的App,可以通过应用之星提供的个人中心可以实现对内容的管理,编辑、发布、修改,并且还能监测到应用的下载情况,同时也能跟踪到应用的收益情况。如果App做的良好的话,应用之星将会提交到安卓市场,比如移动MM市场等等。是不是真的有这么神奇的工具存在,笔者带大家一起来一次实战操作:
创建自己的APP
在网页上创建App的流程操作非常简单。
首先:需要登陆应用之星网站(www.appstar.com.cn)注册账号并激活。
其次:登录账号,点击“应用制作”,弹出的窗口你将看到“我的应用”,“我的模板”和“系统模板”。大家根据需要自行选择。
下面介绍的是直接制作应用,不利用系统模板了。
再次:点击“添加应用”,弹出的页面你将看到“页面”和“控件”。
点击“页面”你将看到新增页面,每个新增的页面可以编辑修改;点击“控件”你将看到8个控件,包括按钮控件,标签控件,图片控件,浏览器控件,视频控件,音频控件,媒体控件和RSS控件。每个控件都可以自定义,自主发挥你的创意。
有几点需要注意:
1. 根据你的应用选择对应的控件,然后将控件拖入左边的编辑框。
2. 坐标是用来控制每个控件之间的整齐,比如上下对齐,左右对齐。
3. 当控件拖入坐标的编辑框后,可以右击控件,出现“复制”,“粘贴”,“删除”等功能,方便操作。
4. 对控件的名称编辑在文本框内编辑修改。
5. 在应用制作过程中要记得“保存”,以免不当的操作导致之前做的丢失。
6. 菜单栏上面的“新建”按钮可以直接打开“我的应用”。
7. 当一个页面做完后,在做另外一个页面,点击“页面”-“新增页面”即可,每个页面名称和属性都可以自定义。
8. 当做第二页面时,可以直接复制第一个页面,如果是类似的页面,复制的目的是节省时间,减少重复操作。
第四:等所有页面都完成后,接下来是“流程设置”,按钮在菜单栏上,注意看哈。
所谓的流程设置,就是设置“起始页”到“目标页”之间的关系,比如想让“首页”跳转到“目录”,那就先点击起始页里面的“首页”,然后再点击目标页的“目录”。最后保存退出。
第五:如果你想在应用里嵌入广告,那么接着点击“应用设置”里的“广告设置”,广告设置非常简单,按提示操作即可。
第六:在发布之前你也可以预览一下应用,点击菜单栏上面的“预览”按钮即可在线预览,如果满意自己做的应用,那么接下来就可以生成应用了。
当这些简单的工作都完成之后,恭喜你,你已经制作出了属于自己的App,系统会生成此app二种下载方式,可以下载到电脑,也可以二维码扫描下载到手机。
第七:当然如果你想分享给更多的人使用你的app,那么你就要选择发布应用,应用发布和应用的修改都是是在个人中心。应用发布后,要等待管理员的审核,一般在一个工作日内被审核,具体审核状态可以在个人中心里查询。
第八:笔者最想告诉大家的是平台上面的“一键电子书”和“一键淘宝”更容易操作,而且非常快速。[/size]
[3] openfire批改程序,使得在同一个分组里的用户,自动和该组admin互为好友
来源: 互联网 发布时间: 2014-02-18
openfire修改程序,使得在同一个分组里的用户,自动和该组admin互为好友
openfire修改程序,使得在同一个分组里的用户,自动和该组admin互为好友,另外当把用户从组里删除时,自动删除和admin之间的好友列表
在group-edit.jsp中,修改程序,标记为黑体为新添加的,
注意在create和update之间需要sleep一段实践,不然可能会造成客户端(spark)处理会有问题,因为spark是并发处理消息的,
<% // Get parameters boolean add = request.getParameter("add") != null; boolean delete = request.getParameter("remove") != null; boolean updateMember = request.getParameter("updateMember") != null; boolean update = request.getParameter("save") != null; boolean cancel = request.getParameter("cancel") != null; String username = ParamUtils.getParameter(request, "username"); String [] adminIDs = ParamUtils.getParameters(request, "admin"); String [] deleteMembers = ParamUtils.getParameters(request, "delete"); String groupName = ParamUtils.getParameter(request, "group"); GroupManager groupManager = webManager.getGroupManager(); boolean groupInfoChanged = ParamUtils.getBooleanParameter(request, "groupChanged", false); Map<String,String> errors = new HashMap<String,String>(); // Get the presence manager PresenceManager presenceManager = webManager.getPresenceManager(); UserManager userManager = webManager.getUserManager(); boolean enableRosterGroups = ParamUtils.getBooleanParameter(request,"enableRosterGroups"); boolean shareAdditional = ParamUtils.getParameter(request, "shareContactList") != null; String groupDisplayName = ParamUtils.getParameter(request,"groupDisplayName"); String showGroup = ParamUtils.getParameter(request,"showGroup"); String[] groupNames = ParamUtils.getParameters(request, "groupNames"); Group group = groupManager.getGroup(groupName); boolean success; StringBuffer errorBuf = new StringBuffer(); if (cancel) { response.sendRedirect("group-summary.jsp"); return; } if (update) { if (enableRosterGroups && (groupDisplayName == null || groupDisplayName.trim().length() == 0)) { errors.put("groupDisplayName", ""); } if (errors.isEmpty()) { if (enableRosterGroups) { if (showGroup == null || !shareAdditional) { showGroup = "onlyGroup"; } if ("spefgroups".equals(showGroup)) { showGroup = "onlyGroup"; } else { groupNames = new String[] {}; } group.getProperties().put("sharedRoster.showInRoster", showGroup); if (groupDisplayName != null) { group.getProperties().put("sharedRoster.displayName", groupDisplayName); } group.getProperties().put("sharedRoster.groupList", toList(groupNames, "UTF-8")); if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) { // Log the event webManager.logEvent("enabled roster groups for "+groupName, "showinroster = "+showGroup+"\ndisplayname = "+groupDisplayName+"\ngrouplist = "+toList(groupNames, "UTF-8")); } } else { group.getProperties().put("sharedRoster.showInRoster", "nobody"); group.getProperties().put("sharedRoster.displayName", ""); group.getProperties().put("sharedRoster.groupList", ""); if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) { // Log the event webManager.logEvent("disabled roster groups for "+groupName, null); } } // Get admin list and compare it the admin posted list. response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&groupChanged=true"); return; } else { // Continue editing since there are some errors updateMember = false; } } if (updateMember) { Set<JID> adminIDSet = new HashSet<JID>(); for (String adminID : adminIDs) { JID newAdmin = new JID(adminID); adminIDSet.add(newAdmin); boolean isAlreadyAdmin = group.getAdmins().contains(newAdmin); if (!isAlreadyAdmin) { // Add new admin group.getAdmins().add(newAdmin); Collection<JID> members = group.getMembers(); for(JID member:members){ Roster roster = webManager.getRosterManager().getRoster(member.getNode()); List<String> groups = new ArrayList<String>(); groups.add("\u6211\u7684\u597d\u53cb"); String nickName = UserManager.getInstance().getUser(newAdmin.getNode()).getName(); roster.createRosterItem(newAdmin, nickName, groups, true, true); Roster roster1 = webManager.getRosterManager().getRoster(newAdmin.getNode()); String nickName1 = UserManager.getInstance().getUser(member.getNode()).getName(); roster1.createRosterItem(member, nickName1, groups, true, true); try{ Thread.sleep(1000); }catch(Exception e){ } RosterItem item = roster.getRosterItem(newAdmin); item.setNickname(nickName); item.setSubStatus(RosterItem.SUB_BOTH); roster.updateRosterItem(item); RosterItem item1 = roster1.getRosterItem(member); item1.setNickname(nickName1); item1.setSubStatus(RosterItem.SUB_BOTH); roster1.updateRosterItem(item1); } } } Collection<JID> admins = Collections.unmodifiableCollection(group.getAdmins()); Set<JID> removeList = new HashSet<JID>(); for (JID admin : admins) { if (!adminIDSet.contains(admin)) { removeList.add(admin); } } Collection<JID> members = group.getMembers();//JUSTIN added for (JID member : removeList) { group.getMembers().add(member); for(JID jid:members){ Roster roster = webManager.getRosterManager().getRoster(jid.getNode()); roster.deleteRosterItem(member,false); Roster roster1 = webManager.getRosterManager().getRoster(member.getNode()); roster1.deleteRosterItem(jid,false); } } if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) { // Log the event // TODO: Should log more here later webManager.logEvent("updated group membership for "+groupName, null); } // Get admin list and compare it the admin posted list. response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&updatesuccess=true"); return; } else if (add && username != null) { int count = 0; username = username.trim(); username = username.toLowerCase(); if (username.indexOf('@') != -1) { try { UserManager.getInstance().getUser(JID.escapeNode(username)); // That means that this user has an email address as their node. username = JID.escapeNode(username); } catch (UserNotFoundException e) { } } // Add to group as member by default. try { boolean added; if (username.indexOf('@') == -1) { // No @ was found so assume this is a JID of a local user username = JID.escapeNode(username); username = Stringprep.nodeprep(username); User user = UserManager.getInstance().getUser(username); JID newUser = webManager.getXMPPServer().createJID(username, null); added = group.getMembers().add(newUser); Collection<JID> admins = group.getAdmins(); for(JID admin:admins){ Roster roster = webManager.getRosterManager().getRoster(admin.getNode()); List<String> groups = new ArrayList<String>(); groups.add("\u6211\u7684\u597d\u53cb"); roster.createRosterItem(newUser, user.getName(), groups, true, true); Roster roster1 = webManager.getRosterManager().getRoster(newUser.getNode()); String nickName1 = UserManager.getInstance().getUser(admin.getNode()).getName(); roster1.createRosterItem(admin, nickName1, groups, true, true); try{ Thread.sleep(1000); }catch(Exception e){ } RosterItem item = roster.getRosterItem(newUser); item.setNickname(user.getName()); item.setSubStatus(RosterItem.SUB_BOTH); roster.updateRosterItem(item); RosterItem item1 = roster1.getRosterItem(admin); item1.setNickname(nickName1); item1.setSubStatus(RosterItem.SUB_BOTH); roster1.updateRosterItem(item1); } } else { // Admin entered a JID. Add the JID directly to the list of group members JID newUser = new JID(username); added = group.getMembers().add(newUser); Collection<JID> admins = group.getAdmins(); for(JID admin:admins){ Roster roster = webManager.getRosterManager().getRoster(admin.getNode()); List<String> groups = new ArrayList<String>(); groups.add("\u6211\u7684\u597d\u53cb"); String nickName = UserManager.getInstance().getUser(username).getName(); roster.createRosterItem(newUser, nickName, groups, true, true); Roster roster1 = webManager.getRosterManager().getRoster(newUser.getNode()); String nickName1 = UserManager.getInstance().getUser(admin.getNode()).getName(); roster1.createRosterItem(admin, nickName1, groups, true, true); try{ Thread.sleep(1000); }catch(Exception e){ } RosterItem item = roster.getRosterItem(newUser); item.setNickname(nickName); item.setSubStatus(RosterItem.SUB_BOTH); roster.updateRosterItem(item); RosterItem item1 = roster1.getRosterItem(admin); item1.setNickname(nickName1); item1.setSubStatus(RosterItem.SUB_BOTH); roster1.updateRosterItem(item1); } if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) { // Log the event webManager.logEvent("added group member to "+groupName, "username = "+username); } } if (added) { count++; } else { errorBuf.append("<br>").append( LocaleUtils.getLocalizedString("group.edit.already_user", Arrays.asList(username))); } } catch (Exception e) { Log.warn("Problem adding new user to existing group", e); errorBuf.append("<br>").append( LocaleUtils.getLocalizedString("group.edit.inexistent_user", Arrays.asList(username))); } if (count > 0) { response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&success=true"); return; } else { success = false; add = true; } } else if(add && username == null){ add = false; } else if (delete) { for (String deleteMember : deleteMembers) { JID member = new JID(deleteMember); if(group.getAdmins().contains(member)){ for(JID jid:group.getMembers()){ Roster roster = webManager.getRosterManager().getRoster(jid.getNode()); roster.deleteRosterItem(member,false); Roster roster1 = webManager.getRosterManager().getRoster(member.getNode()); roster1.deleteRosterItem(jid,false); } }else{ for(JID jid:group.getAdmins()){ Roster roster = webManager.getRosterManager().getRoster(jid.getNode()); roster.deleteRosterItem(member,false); Roster roster1 = webManager.getRosterManager().getRoster(member.getNode()); roster1.deleteRosterItem(jid,false); } } group.getMembers().remove(member); group.getAdmins().remove(member); } response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&deletesuccess=true"); return; } success = groupInfoChanged || "true".equals(request.getParameter("success")) || "true".equals(request.getParameter("deletesuccess")) || "true".equals(request.getParameter("updatesuccess")) || "true".equals(request.getParameter("creategroupsuccess")); if (errors.size() == 0) { showGroup = group.getProperties().get("sharedRoster.showInRoster"); enableRosterGroups = !"nobody".equals(showGroup); shareAdditional = "everybody".equals(showGroup); if ("onlyGroup".equals(showGroup)) { String glist = group.getProperties().get("sharedRoster.groupList"); List<String> l = new ArrayList<String>(); if (glist != null) { StringTokenizer tokenizer = new StringTokenizer(glist,",\t\n\r\f"); while (tokenizer.hasMoreTokens()) { String tok = tokenizer.nextToken().trim(); l.add(tok.trim()); } if (!l.isEmpty()) { shareAdditional = true; } } groupNames = l.toArray(new String[]{}); } groupDisplayName = group.getProperties().get("sharedRoster.displayName"); } %>
最新技术文章: