Разработка сервера приложений - Дипломная работа

бесплатно 0
4.5 56
Анализ информационной системы "Бурятия.INFO". Построение функциональной модели "Как надо", диаграммы прецедентов, диаграммы последовательности действий, диаграммы классов. Разработка программного приложения в интегрированной среде Intellij IDEA.

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
Данная выпускная квалификационная работа посвящена вопросам разработки сервера приложений для ИП «Баяртуев Д.Б.». В проекте были использованы известные в настоящее время технологии проектирования и средства разработки приложений, а именно: интегрированная среда разработки Intellij IDEA, средства проектирования IBM Rational Rose и BPWIN. В рамках проекта выполнены анализ предметной области, построена функциональная модель «Как надо», диаграмма прецедентов, диаграмма последовательности действий, диаграмма классов, разработано программное приложение. Со временем могут появиться потребности в функционале, который не был предусмотрен первоначальной реализацией информационной системы. Внедрение сервера приложения позволяет существенно повысить функциональность и производительность готовой информационной системы, позволяя избежать изменений последней.Информационная система «Бурятия.INFO» представляет собой сайт справочник компаний города Улан-Удэ. Проект «Бурятия.INFO» рассчитан на широкую аудиторию, и предназначен в первую очередь для клиентов компаний, отзывы о которых размещаются на сайте. «Бурятия.INFO» это саморегулирующееся сообщество, где каждый пользователь может определенным образом повлиять на рейтинг компаний, других пользователей, вступить в обсуждение либо дискуссию с пользователями сайта. Сервер приложений должен обрабатывать запросы сгенерированные браузером-клиентом, исполнять приложение, и отсылать результат обратно. После внедрения сервера приложений в информационную систему «Бурятия.INFO» заказчик получить гибкое, эффективное средство, которое позволит без изменений в архитектуре и исходном коде приложения расширять функционал информационной системы путем построения дополнительных модулей.В рамках дипломного проектирования разработаны диаграмма классов, диаграмма прецедентов и диаграмма последовательности действий. На диаграмме представлено три актера: Администратор - отвечает за настройку сервера, отдает команды на запуск и остановку последнего. Связанные процессы: “Настроить сервер”, “Запустить сервер приложений” и “Остановить сервер”. После обращения администратора к процессам “Запустить сервер приложений” и “Остановить сервер” контроль над работой сервера передается виртуальной машине. На выше описанной диаграмме представлены все основные актеры и процессы, участвующие в работе разрабатываемой информационной системе «Сервер приложений».Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры. В версии Ultimate Edition реализована поддержка Java EE, UML-диаграмм, подсчет покрытия кода, а также поддержка других систем управления версиями, языков и фреймворков. Для управления работы приложения на транспортном уровне был выбран фреймворк Netty. Приложение - программная единица, исполняемая в контексте сервера приложений и реализующая бизнес-логику. В случае если приложение не было найдено в кэше, производится поиск по пространству имен приложения.Программа представляет собой консольное Java-приложение. Для работы с данной программой пользователь должен иметь навыки работы с операционными системами Windows XP. Также необходимо учесть, что для выполнения некоторых приложений может понадобиться дополнительное программное обеспечение, например, система управления базами данных. Ниже представлены реализованные параметры запуска. configpath: - указывает системный путь к конфигурационному файлу. autostart - указывает приложению о необходимости запуска сервера приложений непосредственно после запуска. Ниже представлены возможные конфигурационные значения, и их описание. server-poolsize - определяет размер пула потоков исполнения, отвечающих за управление соединениями.

Список литературы
1. Андон Ф., Резниченко В. Язык запросов SQL. Учебный курс. - СПБ.: Питер, 2006. - 416 с.

2. Горбунов-Посадов М.М. Расширяемые программы. - М.: Полиптих, 1999. - 336 с

3. Герберт Шилдт. Java. Полное руководство. Java SE 7 = Java 7: The Complete Reference. - 8-е изд. - М.: Вильямс, 2012. - 1104 с.

4. Давыдов, С., Ефимов, А. INTELLIJ IDEA. Профессиональное программирование на Java (В Подлиннике). - 1-е изд. - СПБ.: BHV. - 800 с.

5. Wikipedia.org [Сайт]. - URL:

ПРИЛОЖЕНИЕ package com.gmail.dosofredriver.ajax.serviceserver;

import com.gmail.dosofredriver.ajax.serviceserver.server.TCPSERVER;

import com.gmail.dosofredriver.ajax.serviceserver.service.worker.Worker;

import com.gmail.dosofredriver.ajax.serviceserver.util.configure.Configurator;

import com.gmail.dosofredriver.ajax.serviceserver.util.logger.SERVERLOGGER;

import com.gmail.dosofredriver.ajax.serviceserver.util.view.CONSOLEVIEW;

import com.gmail.dosofredriver.ajax.serviceserver.util.view.VIEWINTERFACE;

import java.io.BUFFEREDREADER;

import java.io.IOEXCEPTION;

import java.io.INPUTSTREAMREADER;

import java.util.logging.Level;

/**

* Date: 06.03.13

* Time: 22:54

*

* @author DOSOFRR

*/ public class Commander { public static final String DEFAULT_CONFIG_PATH = "config/config.txt";

private String CONFIGPATH = DEFAULT_CONFIG_PATH;

private VIEWINTERFACE view;

private SERVERLOGGER logger;

private TCPSERVER server;

private Thread SERVERTHREAD;

private Thread WORKERTHREAD;

private Worker worker;

private boolean AUTOSTART = false;

private boolean ISLOGGED = false;

public Commander(VIEWINTERFACE view, String ... args) { this.view = view;

init(args);

} private void init(String ... args) { try {

PARSEARGS(args);

Configurator config = new Configurator(CONFIGPATH);

logger = config.GETCONFIGUREDLOGGER();

server = config.GETCONFIGUREDSERVER();

worker = config.GETCONFIGUREDWORKER();

worker.SETLOGGER(logger);

server.SETLOGGER(logger);

server.SETFILTER(config.GETCONFIGUREDFILTER());

if (logger != null) {

ISLOGGED = true;

server.SETLOGGER(logger);

} if (AUTOSTART) { this.STARTSERVER();

}

} catch (Exception e) {

System.err.println("An error occupied while initializing server:

" e);

}

} private void PARSEARGS(String ... args) { for (String arg : args) {

String value = null;

String type;

if (arg.contains(":")) { type = arg.substring(0, arg.INDEXOF(":"));

value = arg.substring(arg.INDEXOF(":") 1, arg.length());

} else { type = arg;

} switch (type) { case "configpath" : CONFIGPATH = "value"; break;

case "autostart" : AUTOSTART = true; break;

default: {

System.out.println("Option " value " is not supported!");

System.exit(0);

}

}

}

} public void STARTSERVER() {

SERVERTHREAD = new Thread(new Runnable() {

@Override public void run() { server.start();

}

});

WORKERTHREAD = new Thread(new Runnable() {

@Override public void run() { try { worker.start(); //todo ex

} catch (INTERRUPTEDEXCEPTION e) { logger.log(Level.SEVERE, "Can not start worker!", e);

}

}

});

SERVERTHREAD.SETDAEMON(true);

SERVERTHREAD.start();

WORKERTHREAD.SETDAEMON(true);

WORKERTHREAD.start();

} public void STOPSERVER() { try { server.stop();

SERVERTHREAD.interrupt();

worker.stop();

WORKERTHREAD.interrupt();

} catch (INTERRUPTEDEXCEPTION e) { logger.log(Level.WARNING, "An error occupied while stopping server", e);

}

} public boolean deploy() { return false;

}

/*

* This is a default program entry point.

*/ public static void main(String ... args) {

Commander commander = new Commander(new CONSOLEVIEW(), args);

BUFFEREDREADER br = new BUFFEREDREADER(new INPUTSTREAMREADER(System.in));

boolean run = true;

try { commander.view.SHOWDEFAULT();

} catch (IOEXCEPTION e) { e.PRINTSTACKTRACE();

} while (run) { byte [] message;

try { message = br.READLINE().GETBYTES();

switch (commander.view.READMESSAGE(message)) { case Help : commander.view.SHOWHELP(); break;

case Start_Server : commander.STARTSERVER(); break;

case Stop_Server : commander.STOPSERVER(); break;

case Undefined : commander.view.SHOWMESSAGE("Undefined command."); break;

case Exit : run = false; break;

default : commander.view.SHOWMESSAGE("Not supported yet.");

}

} catch (IOEXCEPTION e) { e.PRINTSTACKTRACE();

}

}

}

} package com.gmail.dosofredriver.ajax.serviceserver.server;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.CONNECTIONFILTER;

import com.gmail.dosofredriver.ajax.serviceserver.server.pipeline.SERVERPIPELINEFACTORY;

import com.gmail.dosofredriver.ajax.serviceserver.util.logger.SERVERLOGGER;

import org.jboss.netty.bootstrap.SERVERBOOTSTRAP;

import org.jboss.netty.channel.Channel;

import org.jboss.netty.channel.CHANNELFUTURE;

import org.jboss.netty.channel.socket.nio.NIOSERVERSOCKETCHANNELFACTORY;

import java.net.INETSOCKETADDRESS;

import java.util.concurrent.EXECUTORSERVICE;

import java.util.concurrent.Executors;

import java.util.logging.Level;

/**

* Date: 25.02.13

* Time: 23:47

*

* @author DOSOFRR

*/ public class TCPSERVER { public static final String DEFAULT_IP_ADDRESS = "127.0.0.1";

public static final int DEFAULT_POOL_SIZE = 4;

public static final int DEFAULT_PORT = 777;

private SERVERPIPELINEFACTORY SERVERPIPELINE;

private SERVERBOOTSTRAP server;

private SERVERLOGGER logger;

private Channel MAINCHANNEL;

private String address;

private boolean ISSTARTED = false;

private boolean ISLOGGED = false;

private int POOLSIZE;

private int port;

public TCPSERVER() { this(DEFAULT_PORT, DEFAULT_POOL_SIZE, DEFAULT_IP_ADDRESS);

} public TCPSERVER(int port) { this(port, DEFAULT_POOL_SIZE, DEFAULT_IP_ADDRESS);

} public TCPSERVER(int port, int POOLSIZE) { this(port, POOLSIZE, DEFAULT_IP_ADDRESS);

} public TCPSERVER(int port, int POOLSIZE, String address) { this.port = port;

this.address = address;

this.POOLSIZE = POOLSIZE;

SERVERPIPELINE = new SERVERPIPELINEFACTORY();

} public void start() { if (!ISSTARTED) { try {

EXECUTORSERVICE BOSSEXEC = Executors.NEWFIXEDTHREADPOOL(1);

EXECUTORSERVICE WORKEXEC = Executors.NEWFIXEDTHREADPOOL(POOLSIZE);

server = new SERVERBOOTSTRAP(new NIOSERVERSOCKETCHANNELFACTORY(BOSSEXEC, WORKEXEC, POOLSIZE));

server.SETOPTION("backlog", 500); //todo config server.SETOPTION("CONNECTTIMEOUTMILLIS", 10000);

server.SETPIPELINEFACTORY(SERVERPIPELINE);

MAINCHANNEL = server.bind(new INETSOCKETADDRESS(address, port));

ISSTARTED = true;

if (ISLOGGED) { logger.log(Level.INFO, "Server started on " port " port.");

}

System.out.println("Server started on " port " port.");

} catch (Exception e) { if (ISLOGGED) {

System.out.println("An error occupied while starting server. See log for more info.");

logger.log(Level.SEVERE, "An error occupied while starting server.", e);

} else {

System.out.println("An error occupied while starting server.

" e);

}

}

} else {

System.out.println("Server is already started!");

}

} public void stop() { if (ISSTARTED) {

CHANNELFUTURE future = MAINCHANNEL.close();

future.AWAITUNINTERRUPTIBLY();

server.shutdown();

ISSTARTED = false;

if (ISLOGGED) { logger.log(Level.INFO, "Server was manually stopped.");

}

System.out.println("Server stopped.");

} else {

System.out.println("Server is not started!");

}

} public SERVERLOGGER GETLOGGER() { return logger;

} public void SETLOGGER(SERVERLOGGER logger) { if (logger == null) { throw new NULLPOINTEREXCEPTION("Logger can not be null!");

} this.logger = logger;

ISLOGGED = true;

} public void SETFILTER(CONNECTIONFILTER filter) throws Exception {

SERVERPIPELINE.GETPIPELINE().ADDFIRST("Filter", filter);

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.session;

import org.jboss.netty.channel.Channel;

import java.nio.BYTEBUFFER;

/**

* Date: 02.03.13

* Time: 19:13

*

* @author DOSOFRR

*/ public class Session { private BYTEBUFFER data;

private Channel channel;

public Session(BYTEBUFFER data, Channel channel) { this.SETCHANNEL(channel);

this.SETDATA(data);

} public BYTEBUFFER GETDATA() { return data;

} public void SETDATA(BYTEBUFFER data) { this.data = data;

} public Channel GETCHANNEL() { return channel;

} public void SETCHANNEL(Channel channel) { this.channel = channel;

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.session;

import org.jboss.netty.channel.CHANNELFUTURE;

import org.jboss.netty.channel.CHANNELFUTURELISTENER;

import org.jboss.netty.channel.Channels;

import java.util.concurrent.BLOCKINGQUEUE;

import java.util.concurrent.LINKEDBLOCKINGQUEUE;

/**

* Date: 27.02.13

* Time: 14:42

*

* @author DOSOFRR

*/ public class SESSIONCONTROLLER { private BLOCKINGQUEUE store;

private static SESSIONCONTROLLER OURINSTANCE = new SESSIONCONTROLLER();

public static SESSIONCONTROLLER GETINSTANCE() { return OURINSTANCE;

} private SESSIONCONTROLLER() { store = new LINKEDBLOCKINGQUEUE();

} public void PUTSESSION(Session session) throws INTERRUPTEDEXCEPTION { store.put(session);

} public void response(Session session) {

CHANNELFUTURE future = Channels.write(session.GETCHANNEL(), session);

future.ADDLISTENER(CHANNELFUTURELISTENER.CLOSE);

} public Session GETSESSION() throws INTERRUPTEDEXCEPTION { return store.take();

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.pipeline;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.CONNECTIONFILTER;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.DATAREADER;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.Decoder;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.Encoder;

import org.jboss.netty.channel.CHANNELPIPELINE;

import org.jboss.netty.channel.CHANNELPIPELINEFACTORY;

import org.jboss.netty.channel.Channels;

/**

* Date: 26.02.13

* Time: 23:26

*

* @author DOSOFRR

*/ public class SERVERPIPELINEFACTORY implements CHANNELPIPELINEFACTORY {

@Override public CHANNELPIPELINE GETPIPELINE() throws Exception {

CONNECTIONFILTER filter = new CONNECTIONFILTER();

//todo config

CHANNELPIPELINE result = Channels.pipeline(new Decoder(), new Encoder(), new DATAREADER());

return result;

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.handlers;

import org.jboss.netty.channel.CHANNELEVENT;

import org.jboss.netty.channel.CHANNELHANDLERCONTEXT;

import org.jboss.netty.channel.SIMPLECHANNELUPSTREAMHANDLER;

import java.io.BUFFEREDREADER;

import java.io.FILEREADER;

import java.io.IOEXCEPTION;

import java.util.HASHSET;

import java.util.Set;

/**

* Date: 26.02.13

* Time: 14:49

*

* @author DOSOFRR

*/ public class CONNECTIONFILTER extends SIMPLECHANNELUPSTREAMHANDLER { public static final String DEFAULT_WHITELIST_PATH = "config/whitelist.txt";

public static final String DEFAULT_BLACKLIST_PATH = "config/blacklist.txt";

public static final int WHITELIST_ON = 0;

public static final int BLACKLIST_ON = 1;

public static final int WHITELIST_OFF = 3;

public static final int BLACKLIST_OFF = 4;

private final Set WHITELIST = new HASHSET();

private final Set BLACKLIST = new HASHSET();

private String WHITELISTPATH;

private String BLACKLISTPATH;

private boolean ISWHITELISTON;

private boolean ISBLACKLISTON;

public CONNECTIONFILTER() {

ISWHITELISTON = false;

ISBLACKLISTON = false;

WHITELISTPATH = DEFAULT_WHITELIST_PATH;

BLACKLISTPATH = DEFAULT_BLACKLIST_PATH;

} public void SETOPTION(int list, String LISTPATH) throws ILLEGALARGUMENTEXCEPTION, IOEXCEPTION { switch (list) { case BLACKLIST_ON: {

BLACKLISTPATH = LISTPATH;

ISBLACKLISTON = true;

} break;

case WHITELIST_ON: {

WHITELISTPATH = LISTPATH;

ISWHITELISTON = true;

} break;

default: throw new ILLEGALARGUMENTEXCEPTION();

}

LOADLIST();

} public void SETOPTION(int list) throws ILLEGALARGUMENTEXCEPTION, IOEXCEPTION { switch (list) { case BLACKLIST_ON: ISBLACKLISTON = true; break;

case WHITELIST_ON: ISWHITELISTON = true; break;

case BLACKLIST_OFF: ISBLACKLISTON = false; break;

case WHITELIST_OFF: ISWHITELISTON = false; break;

default: throw new ILLEGALARGUMENTEXCEPTION();

}

LOADLIST();

} public boolean RELOADLISTS() throws IOEXCEPTION {

LOADLIST();

return true;

}

@Override public void HANDLEUPSTREAM(CHANNELHANDLERCONTEXT ctx, CHANNELEVENT e) throws Exception {

String addr;

addr = ctx.GETCHANNEL().GETREMOTEADDRESS().TOSTRING();

addr = addr.substring(1, addr.INDEXOF(":"));

if (ISBLACKLISTON) { if (BLACKLIST.contains(addr)) { ctx.GETCHANNEL().close(); //rejects incoming connection

}

} if (ISWHITELISTON) { if (!WHITELIST.contains(addr)) { ctx.GETCHANNEL().close(); //rejects incoming connection

}

}

} private void LOADLIST() throws IOEXCEPTION {

BUFFEREDREADER br;

String line;

if (ISBLACKLISTON) { br = new BUFFEREDREADER(new FILEREADER(BLACKLISTPATH));

while ((line = br.READLINE()) != null) {

BLACKLIST.add(line);

}

} if (ISWHITELISTON) { br = new BUFFEREDREADER(new FILEREADER(WHITELISTPATH));

while ((line = br.READLINE()) != null) {

WHITELIST.add(line);

}

}

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.handlers;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.Session;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.SESSIONCONTROLLER;

import org.jboss.netty.channel.CHANNELHANDLERCONTEXT;

import org.jboss.netty.channel.EXCEPTIONEVENT;

import org.jboss.netty.channel.MESSAGEEVENT;

import org.jboss.netty.channel.SIMPLECHANNELUPSTREAMHANDLER;

/**

* Date: 26.02.13

* Time: 23:51

*

* @author DOSOFRR

*/ public class DATAREADER extends SIMPLECHANNELUPSTREAMHANDLER {

@Override public void MESSAGERECEIVED(final CHANNELHANDLERCONTEXT ctx, MESSAGEEVENT e) throws Exception {

Object message = e.GETMESSAGE();

if (message instanceof Session) {

SESSIONCONTROLLER.GETINSTANCE().PUTSESSION((Session) message);

}

}

@Override public void EXCEPTIONCAUGHT(CHANNELHANDLERCONTEXT ctx, EXCEPTIONEVENT e) throws Exception {

//todo log exception

System.err.println("Err from: " e.GETCHANNEL().GETREMOTEADDRESS());

e.GETCHANNEL().close();

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.handlers;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.Session;

import org.jboss.netty.buffer.CHANNELBUFFER;

import org.jboss.netty.channel.Channel;

import org.jboss.netty.channel.CHANNELHANDLERCONTEXT;

import org.jboss.netty.handler.codec.oneone.ONETOONEDECODER;

import java.nio.BYTEBUFFER;

/**

* Date: 27.02.13

* Time: 2:07

*

* @author DOSOFRR

*/ public class Decoder extends ONETOONEDECODER { private int length;

@Override protected Object decode(CHANNELHANDLERCONTEXT ctx, Channel channel, Object msg) throws Exception { if (msg instanceof CHANNELBUFFER) {

BYTEBUFFER data = BYTEBUFFER.wrap(((CHANNELBUFFER) msg).array());

return new Session(data, channel);

} return null;

}

} package com.gmail.dosofredriver.ajax.serviceserver.server.handlers;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.Session;

import org.jboss.netty.buffer.CHANNELBUFFERS;

import org.jboss.netty.channel.Channel;

import org.jboss.netty.channel.CHANNELHANDLERCONTEXT;

import org.jboss.netty.handler.codec.oneone.ONETOONEENCODER;

/**

* Date: 02.03.13

* Time: 19:06

*

* @author DOSOFRR

*/ public class Encoder extends ONETOONEENCODER {

@Override protected Object encode(CHANNELHANDLERCONTEXT ctx, Channel channel, Object msg) throws Exception { if (msg instanceof Session) { return CHANNELBUFFERS.WRAPPEDBUFFER(((Session) msg).GETDATA());

} else { return CHANNELBUFFERS.EMPTY_BUFFER;

} //note the writer should manually close channel after the message walk through pipeline

}

} package com.gmail.dosofredriver.ajax.serviceserver.service;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.Session;

import com.gmail.dosofredriver.ajax.serviceserver.util.invoke.Invoker;

import com.gmail.dosofredriver.ajax.serviceserver.util.parser.Parser;

import java.nio.BYTEBUFFER;

/**

* Date: 07.03.13

* Time: 21:19

*

* @author DOSOFRR

*/ public class Service { public static Session service(Session session) throws Exception {

String request = new String(session.GETDATA().array()); //get AJAX request

Object result = Invoker.invoke(Parser.PARSEREQUEST(request)); //parse it, and call application return new Session(BYTEBUFFER.wrap(result.TOSTRING().GETBYTES()), session.GETCHANNEL()); //return new Session

}

} package com.gmail.dosofredriver.ajax.serviceserver.service.worker;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.Session;

import com.gmail.dosofredriver.ajax.serviceserver.server.session.SESSIONCONTROLLER;

import com.gmail.dosofredriver.ajax.serviceserver.service.Service;

import com.gmail.dosofredriver.ajax.serviceserver.util.logger.SERVERLOGGER;

import java.util.concurrent.EXECUTORSERVICE;

import java.util.concurrent.Executors;

import java.util.concurrent.TIMEUNIT;

import java.util.logging.Level;

/**

* Date: 06.03.13

* Time: 21:04

*

* @author DOSOFRR

*/ public class Worker { public static final int DEFAULT_POOL_SIZE = 8;

private volatile boolean STOPFLAG = false;

private EXECUTORSERVICE executor;

private SERVERLOGGER logger;

private boolean ISLOGGED = false;

public Worker() { this(DEFAULT_POOL_SIZE);

} public Worker(int pool_size) { init(pool_size);

} private void init(int pool_size) { executor = Executors.NEWFIXEDTHREADPOOL(pool_size);

} public void start() throws INTERRUPTEDEXCEPTION { if (ISLOGGED) { logger.log(Level.INFO, "Worker started.");

}

STOPFLAG = false;

while (!STOPFLAG) { final Session session = SESSIONCONTROLLER.GETINSTANCE().GETSESSION();

executor.execute(new Runnable() {

@Override public void run() { try { SESSIONCONTROLLER.GETINSTANCE().response(Service.service(session));

} catch (Exception e) { if (ISLOGGED) { logger.log(Level.SEVERE, "An error occupied while parsing request!", e);

session.GETCHANNEL().close(); //note try to use AUTOCLOSEABLE

}

}

}

});

}

} public void stop() throws INTERRUPTEDEXCEPTION {

STOPFLAG = true;

executor.AWAITTERMINATION(10, TIMEUNIT.SECONDS); //note С…СЃР№ Р·РЅР°P?C‚ РЇРЅС‡Р?РЈСЃ тасЪРŠрабнтающРЕР? РІРЕСЃСЏС‚ :\ if (ISLOGGED) { logger.log(Level.INFO, "Worker was manually stopped.");

}

} public void SETLOGGER(SERVERLOGGER logger) { if (logger == null) { throw new NULLPOINTEREXCEPTION("Logger can not be null!");

} this.logger = logger;

ISLOGGED = true;

}

} package com.gmail.dosofredriver.ajax.serviceserver.service.annotations;

/**

* This exception указывает for controller implementation error.

* Controller class must be annotated with SERVICECLASS annotation.

*/ public class ISNOTANNOTATEDEXCEPTION extends Throwable { private String message;

public ISNOTANNOTATEDEXCEPTION() { message = "Given class or method is not annotated!";

} public ISNOTANNOTATEDEXCEPTION(Throwable ex) { super(ex);

message = "Given class or method is not annotated!";

} public ISNOTANNOTATEDEXCEPTION(String message) { this.message = message;

} public ISNOTANNOTATEDEXCEPTION(String message, Throwable ex) { super(ex);

this.message = message;

}

} package com.gmail.dosofredriver.ajax.serviceserver.service.annotations;

/**

* This annotation is used as marker for all methods that should be invoked by

* Service class.

*

* @see com.gmail.dosofredriver.ajax.serviceserver.service.Service;

*/ import java.lang.annotation.*;

@Documented

@Target(ELEMENTTYPE.METHOD)

@Retention(RETENTIONPOLICY.RUNTIME) public @interface SERVICEMETHOD {

} package com.gmail.dosofredriver.ajax.serviceserver.util.collections;

import java.util.Comparator;

/**

* Date: 29.03.13

* Time: 21:51

*

* @author DOSOFRR

*/ public class DEFAULTORDERCOMPARATOR implements Comparator {

@Override public int compare(Object o1, Object o2) { return 1;

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.configure;

import com.gmail.dosofredriver.ajax.serviceserver.server.TCPSERVER;

import com.gmail.dosofredriver.ajax.serviceserver.server.handlers.CONNECTIONFILTER;

import com.gmail.dosofredriver.ajax.serviceserver.service.worker.Worker;

import com.gmail.dosofredriver.ajax.serviceserver.util.logger.SERVERLOGGER;

import java.io.File;

import java.io.FILEINPUTSTREAM;

import java.io.IOEXCEPTION;

import java.util.STRINGTOKENIZER;

/**

* Date: 26.04.13

* Time: 2:14

*

* @author DOSOFRR

*/ public class Configurator { private CONNECTIONFILTER CONFIGUREDFILTER;

private SERVERLOGGER CONFIGUREDLOGGER;

private TCPSERVER CONFIGUREDSERVER;

private Worker CONFIGUREDWORKER;

public Configurator(String CONFIGPATH) throws IOEXCEPTION { init(CONFIGPATH);

} private void init(String CONFIGPATH) throws IOEXCEPTION {

String data = READFILE(CONFIGPATH);

if (data == null) {

SETDEFAULTS();

return;

}

PARSECONFIG(data);

} private void PARSECONFIG(String data) throws IOEXCEPTION {

String WHITELIST_path = CONNECTIONFILTER.DEFAULT_WHITELIST_PATH;

String BLACKLIST_path = CONNECTIONFILTER.DEFAULT_BLACKLIST_PATH;

String server_ip = TCPSERVER.DEFAULT_IP_ADDRESS;

String log_name = SERVERLOGGER.DEFAULT_LOG_NAME;

int server_pool_size= TCPSERVER.DEFAULT_POOL_SIZE;

int worker_pool_size= Worker.DEFAULT_POOL_SIZE;

int server_port = TCPSERVER.DEFAULT_PORT;

boolean BLACKLISTON = false;

boolean WHITELISTON = false;

STRINGTOKENIZER tokenizer = new STRINGTOKENIZER(data);

while (tokenizer.HASMORETOKENS()) {

String line = tokenizer.NEXTTOKEN();

String type = line.substring(0, line.INDEXOF("="));

String value= line.substring(line.INDEXOF("=") 1, line.length());

switch (type.TOLOWERCASE()) { case "server-poolsize" : server_pool_size = Integer.PARSEINT(value); break;

case "worker-poolsize" : worker_pool_size = Integer.PARSEINT(value); break;

case "server-port" : server_port = Integer.PARSEINT(value); break;

case "server-ip" : server_ip = value; break;

case "log-name" : log_name = value; break;

case "blacklist" : BLACKLISTON = Boolean.PARSEBOOLEAN(value); break;

case "whitelist" : WHITELISTON = Boolean.PARSEBOOLEAN(value); break;

case "whitelistpath" : WHITELIST_path = value; break;

case "blacklistpath" : BLACKLIST_path = value; break;

default: System.err.println("Unknown config option - " value);

} this.CONFIGUREDWORKER = new Worker(worker_pool_size);

this.CONFIGUREDSERVER = new TCPSERVER(server_port, server_pool_size, server_ip);

this.CONFIGUREDLOGGER = new SERVERLOGGER(SERVERLOGGER.DEFAULT_NAME, log_name);

this.CONFIGUREDFILTER = new CONNECTIONFILTER();

//configure filter if (BLACKLISTON) { this.CONFIGUREDFILTER.SETOPTION(CONNECTIONFILTER.BLACKLIST_ON, BLACKLIST_path);

} if (WHITELISTON) { this.CONFIGUREDFILTER.SETOPTION(CONNECTIONFILTER.WHITELIST_ON, WHITELIST_path);

}

}

} private String READFILE(String CONFIGPATH) throws IOEXCEPTION {

File file = new File(CONFIGPATH);

FILEINPUTSTREAM fis;

byte [] buffer;

if (!file.exists()) { return null;

} fis = new FILEINPUTSTREAM(file);

buffer = new byte[fis.available()];

for (int b, count = 0; (b = fis.read()) != -1; count ) { buffer[count] = (byte) b;

} return new String(buffer);

} private void SETDEFAULTS() throws IOEXCEPTION { this.CONFIGUREDFILTER = new CONNECTIONFILTER();

this.CONFIGUREDLOGGER = new SERVERLOGGER();

this.CONFIGUREDSERVER = new TCPSERVER();

this.CONFIGUREDWORKER = new Worker();

} public CONNECTIONFILTER GETCONFIGUREDFILTER() { return CONFIGUREDFILTER;

} public SERVERLOGGER GETCONFIGUREDLOGGER() { return CONFIGUREDLOGGER;

} public TCPSERVER GETCONFIGUREDSERVER() { return CONFIGUREDSERVER;

} public Worker GETCONFIGUREDWORKER() { return CONFIGUREDWORKER;

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.invoke;

import java.lang.reflect.Method;

import java.util.concurrent.CONCURRENTHASHMAP;

/**

* Date: 29.03.13

* Time: 1:48

*

* @author DOSOFRR

*/ public class INVOKECACHE { private static INVOKECACHE OURINSTANCE = new INVOKECACHE();

private CONCURRENTHASHMAP CACHEDCLASSES = new CONCURRENTHASHMAP();

private CONCURRENTHASHMAP CACHEDMETHODS = new CONCURRENTHASHMAP();

public static INVOKECACHE GETINSTANCE() { return OURINSTANCE;

} private INVOKECACHE() {

} public Method FINDMETHOD(String METHODNAME) { return CACHEDMETHODS.get(METHODNAME);

} public Class FINDCLASS(String CLASSNAME) { return CACHEDCLASSES.get(CLASSNAME);

} public boolean CACHEMETHOD(Method method) { if (FINDMETHOD(method.TOSTRING()) == null) {

CACHEDMETHODS.put(method.TOSTRING(), method);

return true;

} else { return false;

}

} public boolean CACHECLASS(Class clazz) { if (FINDCLASS(clazz.GETNAME()) == null) {

CACHEDCLASSES.put(clazz.GETNAME(), clazz);

return true;

} else { return false;

}

} private void CLEARCACHE() {

CACHEDCLASSES.clear();

CACHEDMETHODS.clear();

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.invoke;

import com.gmail.dosofredriver.ajax.serviceserver.service.annotations.SERVICEMETHOD;

import com.gmail.dosofredriver.ajax.serviceserver.util.parser.METHODSTRUCT;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

/**

* Date: 28.03.13

* Time: 2:11

*

* @author DOSOFRR

*/ public class Invoker { private static ILLEGALARGUMENTEXCEPTION CACHEDEXCEPTION = new ILLEGALARGUMENTEXCEPTION(new NULLPOINTEREXCEPTION("Method can not be null!"));

public static Object invoke(METHODSTRUCT param) throws Exception { //todo check security fuckups

String METHODNAME = param.METHODNAME.substring(param.METHODNAME.LASTINDEXOF(".") 1, param.METHODNAME.length());

String CLASSNAME = param.METHODNAME.substring(0, param.METHODNAME.LASTINDEXOF("."));

Class clazz = GETCLASS(CLASSNAME);

Method method = GETMETHOD(METHODNAME, clazz, param.ARGSTYPES);

if (method == null) throw CACHEDEXCEPTION;

//security check if (!method.ISANNOTATIONPRESENT(SERVICEMETHOD.class)) { throw new SECURITYEXCEPTION("Method is not annotated with SERVICEMETHOD!");

}

//use another invoke type if method is static if (Modifier.ISSTATIC(method.GETMODIFIERS())) { return method.invoke(clazz.GETCLASS(), param.params.TOARRAY());

} else { return method.invoke(clazz.NEWINSTANCE(), param.params.TOARRAY()); //todo create method to get class instance?

}

} private static Method GETMETHOD(String METHODNAME, Class owner, Class [] params) throws NOSUCHMETHODEXCEPTION, CLASSNOTFOUNDEXCEPTION {

INVOKECACHE cache = INVOKECACHE.GETINSTANCE();

Method result;

if ((result = cache.FINDMETHOD(METHODNAME)) != null) { //try to find method in cache return result;

} else { result = owner.GETMETHOD(METHODNAME, params);

return result;

}

} private static Class GETCLASS(String CLASSNAME) throws CLASSNOTFOUNDEXCEPTION {

INVOKECACHE cache = INVOKECACHE.GETINSTANCE();

Class result;

if ((result = cache.FINDCLASS(CLASSNAME)) != null) { return result;

} else { result = Class.FORNAME(CLASSNAME);

cache.CACHECLASS(result);

return result;

}

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.logger;

import java.io.PRINTWRITER;

import java.io.STRINGWRITER;

import java.util.Date;

import java.util.logging.Formatter;

import java.util.logging.Handler;

import java.util.logging.Level;

import java.util.logging.LOGRECORD;

/**

* @author Урванов Ф. В.

* Класс, преобразующий лог в формат HTML.

*

*/ class HTMLFORMATTER extends Formatter {

/**

* Return head of HTML file.

*/

@Override public String GETHEAD(Handler h)

{

/**

* Write title, meta data and table.

*/ return "APPLOG"

""

""

""

"datelevelclassmethod"

"messagethrown messagestacktrace";

}

/**

* Return end of HTML file.

*/

@Override public String GETTAIL(Handler h)

{

/**

* Write end of table and HTML file.

*/ return "";

}

/**

* Format message to table string.

*/

@Override public String format(LOGRECORD record)

{

STRINGBUILDER result=new STRINGBUILDER();

Date d = new Date();

Level level = record.GETLEVEL();

/**

* Error will be highlighted with red color, * warnings with grey, * info messages with white.

*/ if (level==Level.SEVERE)

{ result.append("");

} else if (level==Level.WARNING)

{ result.append("");

} else

{ result.append("");

} result.append("

");

result.append(d);

result.append("");

result.append(record.GETLEVEL().TOSTRING());

result.append("");

result.append(record.GETSOURCECLASSNAME());

result.append("");

result.append(record.GETSOURCEMETHODNAME());

result.append("");

result.append(record.GETMESSAGE());

result.append("")

Throwable thrown = record.GETTHROWN();

if (thrown!=null)

{

// Если было передано исключение, то выводим полный

// стек вызовов. result.append(record.GETTHROWN().GETMESSAGE());

result.append("");

STRINGWRITER sw = new STRINGWRITER();

PRINTWRITER pw = new PRINTWRITER(sw);

record.GETTHROWN().PRINTSTACKTRACE(pw);

String STACKTRACE=sw.TOSTRING();

result.append(STACKTRACE);

result.append("");

} else

{

// Просто пустые ячейки. result.append("null");

result.append("");

}

// Конец строки result.append("

");

return result.TOSTRING();

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.logger;

import java.io.IOEXCEPTION;

import java.util.logging.FILEHANDLER;

import java.util.logging.Level;

import java.util.logging.Logger;

/**

* Date: 09.12.12

* Time: 22:15

*

* @author DOSOFRR

*/ public class SERVERLOGGER { public final static String DEFAULT_LOG_NAME = "log.html";

public final static String DEFAULT_NAME = "Server logger";

private Logger logger;

public SERVERLOGGER() throws IOEXCEPTION { init(DEFAULT_NAME, DEFAULT_LOG_NAME);

} public SERVERLOGGER(String name) throws IOEXCEPTION { init(name, DEFAULT_LOG_NAME);

} public SERVERLOGGER(String name, String filename) throws IOEXCEPTION { init(name, filename);

} private void init(String name, String filename) throws IOEXCEPTION {

FILEHANDLER fh = new FILEHANDLER(filename);

fh.SETFORMATTER(new HTMLFORMATTER());

logger = Logger.GETLOGGER(name);

logger.ADDHANDLER(fh);

} public void log(Level level, String msg) { logger.log(level, msg);

} public void log(Level level, String msg, Throwable ex) { logger.log(level, msg, ex);

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.parser;

import java.util.Set;

/**

* Date: 07.03.13

* Time: 21:27

*

* @author DOSOFRR

*/ public class METHODSTRUCT { public Class [] ARGSTYPES;

public String METHODNAME;

public Set params;

public METHODSTRUCT(String METHODNAME, Set params, Class [] ARGSTYPES) { this.METHODNAME = METHODNAME;

this.ARGSTYPES = ARGSTYPES;

this.params = params;

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.parser;

import com.gmail.dosofredriver.ajax.serviceserver.util.collections.DEFAULTORDERCOMPARATOR;

import org.json.simple.JSONARRAY;

import org.json.simple.JSONOBJECT;

import org.json.simple.parser.JSONPARSER;

import java.util.*;

/**

* Date: 29.03.13

* Time: 3:22

*

* @author DOSOFRR

*/ public class Parser { public static final String KEY_METHODNAME = "METHODNAME";

public static final String KEY_PARAMS = "params";

public static METHODSTRUCT PARSEREQUEST(String query) throws Exception {

Map STRPARAMS = new TREEMAP(new DEFAULTORDERCOMPARATOR());

JSONPARSER parser = new JSONPARSER();

String METHODNAME;

Set params;

JSONOBJECT JSONOBJECT = (JSONOBJECT)parser.parse(query);

//get method name from request

METHODNAME = (String) JSONOBJECT.get(KEY_METHODNAME);

//get params from request

JSONARRAY ja = (JSONARRAY) JSONOBJECT.get(KEY_PARAMS);

for (Object param : ja) {

STRPARAMS.put(

(String) ((JSONOBJECT) param).get("type"), (String) ((JSONOBJECT) param).get("value")

);

}

//get classes from strings

Class [] classes = GETCLASSES(STRPARAMS.KEYSET());

//get parameters params = GETINSTANCES(GETMAP(classes, STRPARAMS.values()));

return new METHODSTRUCT(METHODNAME, params, classes);

} public static Class [] GETCLASSES(Set CLASSNAMES) throws CLASSNOTFOUNDEXCEPTION {

Class [] result = new Class[CLASSNAMES.size()];

int i=0;

for(String name : CLASSNAMES) { switch (name) { case "int" : result[i] = int.class; break;

case "long" : result[i] = long.class; break;

case "boolean" : result[i] = boolean.class;break;

default : result[i] = Class.FORNAME(name);

} i ;

} return result;

} private static Set GETINSTANCES(Map args) throws Exception {

Set result = new TREESET(new DEFAULTORDERCOMPARATOR());

for (Map.Entry entry : args.ENTRYSET()) { switch (entry.GETKEY().TOSTRING()) { case "boolean" : result.add(Boolean.PARSEBOOLEAN(entry.GETVALUE())); break;

case "long" : result.add(Long.PARSELONG(entry.GETVALUE())); break;

case "int" : result.add(Integer.PARSEINT(entry.GETVALUE())); break;

default : result.add(GETINSTANCE(entry.GETKEY(), entry.GETVALUE()));

}

} return result;

} private static T GETINSTANCE(Class TCLASS, String value) throws Exception { return (T)TCLASS.GETCONSTRUCTOR(String.class).NEWINSTANCE(value);

} private static Map GETMAP(Class [] classes, Collection values) {

Map result = new TREEMAP(new DEFAULTORDERCOMPARATOR());

int i = 0;

for (String value : values) { result.put(classes[i], value);

i ;

} return result;

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.view;

/**

* Date: 07.03.13

* Time: 22:32

*

* @author DOSOFRR

*/ public enum Commands {

Start_Server, Stop_Server, Restart_Server, SWITCHOFF_Server, Deploy, Undeploy, Help, Undefined, Exit

} package com.gmail.dosofredriver.ajax.serviceserver.util.view;

import sun.reflect.generics.REFLECTIVEOBJECTS.NOTIMPLEMENTEDEXCEPTION;

import java.io.IOEXCEPTION;

import java.io.OUTPUTSTREAM;

/**

* Date: 07.03.13

* Time: 22:45

*

* @author DOSOFRR

*/ public class CONSOLEVIEW implements VIEWINTERFACE { private OUTPUTSTREAM os;

/*

* Creates an console view.

*

* @param os

* Specifies output stream that will be used to print messages.

*/ public CONSOLEVIEW(OUTPUTSTREAM os) { this.os = os;

} public CONSOLEVIEW() {

//System.out as default output stream. this.os = System.out;

}

@Override public void SHOWDEFAULT() throws IOEXCEPTION { os.write("Welcome to server administration panel.

".GETBYTES());

os.write("\NTYPE \"-help\" to print help

".GETBYTES());

}

@Override public void SHOWHELP() throws IOEXCEPTION { os.write("\NTYPE \"-start\" to start server.".GETBYTES());

os.write("\NTYPE \"-stop\" to stop server.".GETBYTES());

os.write("\NTYPE \"-restart\" to restart server.".GETBYTES());

os.write("\NTYPE \"-help\" to get help.".GETBYTES());

}

@Override public void SHOWMESSAGE(String message) throws IOEXCEPTION { os.write(message.GETBYTES());

}

@Override public void SHOWAUTHORIZE() throws IOEXCEPTION { throw new NOTIMPLEMENTEDEXCEPTION();

}

@Override public Commands READMESSAGE(byte[] message) throws IOEXCEPTION {

String strmsg = new String(message);

switch (strmsg) { case "-start" : return Commands.Start_Server;

case "-stop" : return Commands.Stop_Server;

case "-help" : return Commands.Help;

case "-restart" : return Commands.Restart_Server;

default : return Commands.Undefined;

}

}

} package com.gmail.dosofredriver.ajax.serviceserver.util.view;

import java.io.IOEXCEPTION;

import java.util.concurrent.BLOCKINGQUEUE;

import java.util.concurrent.LINKEDBLOCKINGQUEUE;

/**

* Date: 07.03.13

* Time: 21:47

*

* @author DOSOFRR

*/

/*

* This interface realizes view for admin panel. With that interface you can specify

* your view without changing Commander controller.

*/ public interface VIEWINTERFACE {

BLOCKINGQUEUE messages = new LINKEDBLOCKINGQUEUE();

/*

* This method is used to show initial interface and/or message.

* Here you can write some tips for users, or send HTML form, for example.

*/ public void SHOWDEFAULT() throws IOEXCEPTION;

/*

* Show help, that can describe commands, params etc.

*/ public void SHOWHELP() throws IOEXCEPTION;

/*

* Show some message that server send to user.

*/ public void SHOWMESSAGE(String message) throws IOEXCEPTION;

/*

* Show authorize form/message.

*/ public void SHOWAUTHORIZE() throws IOEXCEPTION;

/*

* This method will invoked when an message will arrived.

* Method should PARSEREQUEST incoming message and * return result as Commands enum.

*/ public Commands READMESSAGE(byte [] message) throws IOEXCEPTION;

}

Размещено на Allbest.ru

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?