From aabe375b4955f671e331746efeb7b86f079cb00a Mon Sep 17 00:00:00 2001 From: Rogiel Date: Fri, 27 May 2011 00:13:59 -0300 Subject: [PATCH] Support for H2 databases Signed-off-by: Rogiel --- .classpath | 3 +- config/database.properties | 8 +- pom.xml | 12 +- src/assembly/distribution-h2-bin.xml | 53 +++ ...on-bin.xml => distribution-mysql5-bin.xml} | 18 +- src/dao/com/l2jserver/db/dao/NPCDAO.java | 3 +- .../h2/com/l2jserver/db/dao/H2DAOModule.java | 45 ++ .../l2jserver/db/dao/h2/AbstractH2DAO.java} | 38 +- .../l2jserver/db/dao/h2/H2CharacterDAO.java | 420 ++++++++++++++++++ .../db/dao/h2/H2CharacterFriendDAO.java | 221 +++++++++ .../h2/com/l2jserver/db/dao/h2/H2ClanDAO.java | 170 +++++++ .../h2/com/l2jserver/db/dao/h2/H2ItemDAO.java | 223 ++++++++++ .../h2/com/l2jserver/db/dao/h2/H2NPCDAO.java | 265 +++++++++++ .../db/dao/mysql5/AbstractMySQL5DAO.java | 6 +- .../db/dao/mysql5/MySQL5CharacterDAO.java | 10 +- .../dao/mysql5/MySQL5CharacterFriendDAO.java | 10 +- .../db/dao/mysql5/MySQL5ClanDAO.java | 10 +- .../db/dao/mysql5/MySQL5ItemDAO.java | 10 +- .../l2jserver/db/dao/mysql5/MySQL5NPCDAO.java | 10 +- .../java/com/l2jserver/GameServerModule.java | 4 +- .../java/com/l2jserver/L2JGameServerMain.java | 4 - .../net/packet/client/AuthLoginPacket.java | 4 +- .../packet/client/CharacterCreatePacket.java | 6 +- .../RequestCharacterTemplatesPacket.java | 10 +- .../com/l2jserver/model/AbstractModel.java | 2 +- .../model/id/object/CharacterID.java | 2 +- .../model/id/template/ActorTemplateID.java | 5 +- .../id/template/CharacterTemplateID.java | 2 +- .../model/template/CharacterTemplate.java | 10 +- .../l2jserver/model/world/L2Character.java | 17 +- .../world/character/CharacterInventory.java | 4 +- .../com/l2jserver/service/ServiceModule.java | 4 +- .../service/core/vfs/VFSServiceImpl.java | 8 + .../service/database/DB4ODatabaseService.java | 53 --- .../service/database/DataAccessObject.java | 4 +- .../service/database/DatabaseService.java | 37 +- ...on.java => JDBCDatabaseConfiguration.java} | 28 +- ...eService.java => JDBCDatabaseService.java} | 49 +- .../service/game/npc/NPCService.java | 4 +- .../service/game/npc/NPCServiceImpl.java | 6 +- .../XMLTemplateServiceConfiguration.java | 2 +- .../com/l2jserver/test/XMLMappingTest.java | 7 +- .../model/id/factory/IDFactoryTest.java | 4 +- .../template/StaticTemplateServiceTest.java | 4 +- .../template/CharacterTemplateConverter.java | 6 +- 45 files changed, 1585 insertions(+), 236 deletions(-) create mode 100644 src/assembly/distribution-h2-bin.xml rename src/assembly/{distribution-bin.xml => distribution-mysql5-bin.xml} (81%) create mode 100644 src/dao/h2/com/l2jserver/db/dao/H2DAOModule.java rename src/{main/java/com/l2jserver/service/database/DB4ODatabaseConfiguration.java => dao/h2/com/l2jserver/db/dao/h2/AbstractH2DAO.java} (50%) create mode 100644 src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterDAO.java create mode 100644 src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterFriendDAO.java create mode 100644 src/dao/h2/com/l2jserver/db/dao/h2/H2ClanDAO.java create mode 100644 src/dao/h2/com/l2jserver/db/dao/h2/H2ItemDAO.java create mode 100644 src/dao/h2/com/l2jserver/db/dao/h2/H2NPCDAO.java delete mode 100644 src/main/java/com/l2jserver/service/database/DB4ODatabaseService.java rename src/main/java/com/l2jserver/service/database/{MySQLDatabaseConfiguration.java => JDBCDatabaseConfiguration.java} (59%) rename src/main/java/com/l2jserver/service/database/{MySQLDatabaseService.java => JDBCDatabaseService.java} (92%) diff --git a/.classpath b/.classpath index 02bd8d54b..ca7327a91 100644 --- a/.classpath +++ b/.classpath @@ -2,8 +2,9 @@ - + + diff --git a/config/database.properties b/config/database.properties index 6bacfe2f5..3c173eff1 100644 --- a/config/database.properties +++ b/config/database.properties @@ -1,4 +1,4 @@ -jdbc.mysql.url = jdbc:mysql://localhost/l2jserver2 -jdbc.mysql.driver = com.mysql.jdbc.Driver -jdbc.mysql.username = l2j -jdbc.mysql.password = changeme \ No newline at end of file +jdbc.url = jdbc:h2:./data/database +jdbc.driver = org.h2.Driver +jdbc.username = l2j +jdbc.password = changeme \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4905838dc..ca7ecbc62 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,13 @@ jar runtime + + com.h2database + h2 + 1.3.154 + jar + runtime + commons-dbcp commons-dbcp @@ -108,7 +115,7 @@ runtime - javacc + net.java.dev.javacc javacc 4.1 jar @@ -221,7 +228,8 @@ 2.2.1 - src/assembly/distribution-bin.xml + src/assembly/distribution-mysql5-bin.xml + src/assembly/distribution-h2-bin.xml src/assembly/distribution-src.xml diff --git a/src/assembly/distribution-h2-bin.xml b/src/assembly/distribution-h2-bin.xml new file mode 100644 index 000000000..680a6fd9c --- /dev/null +++ b/src/assembly/distribution-h2-bin.xml @@ -0,0 +1,53 @@ + + h2-bin + + tar.gz + tar.bz2 + zip + + + + + ${project.basedir} + / + + data/** + + + .gitignore + data/cache/** + data/pathing.db + data/database.h2.* + + + + ${project.basedir}/dist + / + + + ${project.build.directory} + / + + *.jar + + + *-sources.jar + *-javadoc.jar + + + + + + /libs + true + false + runtime + + mysql:mysql-connector-java + + + + \ No newline at end of file diff --git a/src/assembly/distribution-bin.xml b/src/assembly/distribution-mysql5-bin.xml similarity index 81% rename from src/assembly/distribution-bin.xml rename to src/assembly/distribution-mysql5-bin.xml index 82478c7fa..d1e43ff9b 100644 --- a/src/assembly/distribution-bin.xml +++ b/src/assembly/distribution-mysql5-bin.xml @@ -2,7 +2,7 @@ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> - bin + mysql5-bin tar.gz tar.bz2 @@ -16,6 +16,12 @@ data/** + + .gitignore + data/cache/** + data/pathing.db + data/database.h2.* + ${project.basedir}/dist @@ -33,19 +39,15 @@ - - - - - - - /libs true false runtime + + com.h2database:h2 + \ No newline at end of file diff --git a/src/dao/com/l2jserver/db/dao/NPCDAO.java b/src/dao/com/l2jserver/db/dao/NPCDAO.java index f663f691f..0adfbc155 100644 --- a/src/dao/com/l2jserver/db/dao/NPCDAO.java +++ b/src/dao/com/l2jserver/db/dao/NPCDAO.java @@ -16,6 +16,7 @@ */ package com.l2jserver.db.dao; +import java.util.Collection; import java.util.List; import com.l2jserver.model.id.object.NPCID; @@ -35,7 +36,7 @@ public interface NPCDAO extends DataAccessObject, Cacheable { * * @return all NPC instances */ - List loadAll(); + Collection loadAll(); /** * Select an {@link NPC} by its template. diff --git a/src/dao/h2/com/l2jserver/db/dao/H2DAOModule.java b/src/dao/h2/com/l2jserver/db/dao/H2DAOModule.java new file mode 100644 index 000000000..0da1f22f8 --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/H2DAOModule.java @@ -0,0 +1,45 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao; + +import com.google.inject.AbstractModule; +import com.google.inject.Module; +import com.google.inject.Scopes; +import com.l2jserver.db.dao.h2.H2CharacterDAO; +import com.l2jserver.db.dao.h2.H2CharacterFriendDAO; +import com.l2jserver.db.dao.h2.H2ClanDAO; +import com.l2jserver.db.dao.h2.H2ItemDAO; +import com.l2jserver.db.dao.h2.H2NPCDAO; + +/** + * Google Guice {@link Module} for H2 DAOs + * + * @author Rogiel + */ +public class H2DAOModule extends AbstractModule { + @Override + protected void configure() { + bind(CharacterDAO.class).to(H2CharacterDAO.class).in(Scopes.SINGLETON); + bind(CharacterFriendDAO.class).to(H2CharacterFriendDAO.class).in( + Scopes.SINGLETON); + + bind(NPCDAO.class).to(H2NPCDAO.class).in(Scopes.SINGLETON); + + bind(ItemDAO.class).to(H2ItemDAO.class).in(Scopes.SINGLETON); + bind(ClanDAO.class).to(H2ClanDAO.class).in(Scopes.SINGLETON); + } +} diff --git a/src/main/java/com/l2jserver/service/database/DB4ODatabaseConfiguration.java b/src/dao/h2/com/l2jserver/db/dao/h2/AbstractH2DAO.java similarity index 50% rename from src/main/java/com/l2jserver/service/database/DB4ODatabaseConfiguration.java rename to src/dao/h2/com/l2jserver/db/dao/h2/AbstractH2DAO.java index e0642c8b4..28f89f952 100644 --- a/src/main/java/com/l2jserver/service/database/DB4ODatabaseConfiguration.java +++ b/src/dao/h2/com/l2jserver/db/dao/h2/AbstractH2DAO.java @@ -14,29 +14,35 @@ * You should have received a copy of the GNU General Public License * along with l2jserver. If not, see . */ -package com.l2jserver.service.database; +package com.l2jserver.db.dao.h2; -import java.io.File; - -import com.l2jserver.service.configuration.Configuration.ConfigurationName; +import com.google.inject.Inject; +import com.l2jserver.model.Model; +import com.l2jserver.model.id.ID; +import com.l2jserver.service.database.AbstractDAO; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService; /** - * Configuration for DB4O Database Service + * {@link AbstractDAO} for H2 DAO implementation * * @author Rogiel + * + * @param + * the object for the DAO + * @param + * the object ID type */ -@ConfigurationName("db4o") -public interface DB4ODatabaseConfiguration extends DatabaseConfiguration { +public abstract class AbstractH2DAO, I extends ID> + extends AbstractDAO { /** - * @return the database file + * The H2 Database Service */ - @ConfigurationPropertyGetter(name = "db4o.file", defaultValue = "database.bin") - File getDatabaseFile(); + protected final JDBCDatabaseService database; - /** - * @param jdbcUrl - * the new database file - */ - @ConfigurationPropertySetter(name = "db4o.file") - void setDatabaseFile(File file); + @Inject + protected AbstractH2DAO(DatabaseService database) { + super(database); + this.database = (JDBCDatabaseService) database; + } } diff --git a/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterDAO.java b/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterDAO.java new file mode 100644 index 000000000..ecbef6c60 --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterDAO.java @@ -0,0 +1,420 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao.h2; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterDAO; +import com.l2jserver.model.id.AccountID; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.ClanID; +import com.l2jserver.model.id.object.provider.CharacterIDProvider; +import com.l2jserver.model.id.object.provider.ClanIDProvider; +import com.l2jserver.model.id.provider.AccountIDProvider; +import com.l2jserver.model.id.template.CharacterTemplateID; +import com.l2jserver.model.id.template.provider.CharacterTemplateIDProvider; +import com.l2jserver.model.template.CharacterTemplate; +import com.l2jserver.model.world.Actor.ActorRace; +import com.l2jserver.model.world.Actor.ActorSex; +import com.l2jserver.model.world.Clan; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.character.CharacterAppearance; +import com.l2jserver.model.world.character.CharacterAppearance.CharacterFace; +import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairColor; +import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairStyle; +import com.l2jserver.model.world.character.CharacterClass; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; +import com.l2jserver.util.dimensional.Point; + +/** + * {@link CharacterDAO} implementation for H2 + * + * @author Rogiel + */ +public class H2CharacterDAO extends + AbstractH2DAO implements CharacterDAO { + /** + * The {@link CharacterID} factory + */ + private final CharacterIDProvider idFactory; + /** + * The {@link CharacterTemplateID} factory + */ + private final CharacterTemplateIDProvider templateIdFactory; + /** + * The {@link AccountID} factory + */ + private final AccountIDProvider accountIdFactory; + /** + * The {@link ClanID} factory + */ + private final ClanIDProvider clanIdFactory; + + /** + * Character table name + */ + public static final String TABLE = "character"; + // FIELDS + public static final String CHAR_ID = "character_id"; + public static final String ACCOUNT_ID = "account_id"; + public static final String CLAN_ID = "clan_id"; + public static final String NAME = "name"; + + public static final String RACE = "race"; + public static final String CLASS = "class"; + public static final String SEX = "sex"; + + public static final String LEVEL = "level"; + public static final String EXPERIENCE = "experience"; + public static final String SP = "sp"; + + public static final String HP = "hp"; + public static final String MP = "mp"; + public static final String CP = "cp"; + + public static final String POINT_X = "point_x"; + public static final String POINT_Y = "point_y"; + public static final String POINT_Z = "point_z"; + public static final String POINT_ANGLE = "point_angle"; + + public static final String APPEARANCE_HAIR_STYLE = "appearance_hair_style"; + public static final String APPEARANCE_HAIR_COLOR = "appearance_hair_color"; + public static final String APPEARANCE_FACE = "apperance_face"; + + @Inject + public H2CharacterDAO(DatabaseService database, + final CharacterIDProvider idFactory, + CharacterTemplateIDProvider templateIdFactory, + AccountIDProvider accountIdFactory, ClanIDProvider clanIdFactory) { + super(database); + this.idFactory = idFactory; + this.templateIdFactory = templateIdFactory; + this.accountIdFactory = accountIdFactory; + this.clanIdFactory = clanIdFactory; + } + + /** + * The mapper for {@link CharacterID} + */ + private final Mapper idMapper = new Mapper() { + @Override + public CharacterID map(ResultSet rs) throws SQLException { + return idFactory.createID(rs.getInt(CHAR_ID)); + } + }; + + /** + * The {@link Mapper} for {@link L2Character} + */ + private final Mapper mapper = new CachedMapper( + database, idMapper) { + @Override + protected L2Character map(CharacterID id, ResultSet rs) + throws SQLException { + final CharacterClass charClass = CharacterClass.valueOf(rs + .getString(CLASS)); + final CharacterTemplateID templateId = templateIdFactory + .createID(charClass.id); + final CharacterTemplate template = templateId.getTemplate(); + + final L2Character character = template.create(); + + character.setID(id); + character.setAccountID(accountIdFactory.createID(rs + .getString(ACCOUNT_ID))); + if (rs.getString(CLAN_ID) != null) + character.setClanID(clanIdFactory.createID(rs.getInt(CLAN_ID))); + + character.setName(rs.getString(NAME)); + + character.setRace(ActorRace.valueOf(rs.getString(RACE))); + character.setCharacterClass(CharacterClass.valueOf(rs + .getString(CLASS))); + character.setSex(ActorSex.valueOf(rs.getString(SEX))); + + character.setLevel(rs.getInt(LEVEL)); + character.setExperience(rs.getLong(EXPERIENCE)); + character.setSP(rs.getInt(SP)); + + character.setHP(rs.getDouble(HP)); + character.setMP(rs.getDouble(MP)); + character.setCP(rs.getDouble(CP)); + + character.setPoint(Point.fromXYZA(rs.getInt(POINT_X), + rs.getInt(POINT_Y), rs.getInt(POINT_Z), + rs.getDouble(POINT_ANGLE))); + + // appearance + character.getAppearance().setHairStyle( + CharacterHairStyle.valueOf(rs + .getString(APPEARANCE_HAIR_STYLE))); + character.getAppearance().setHairColor( + CharacterHairColor.valueOf(rs + .getString(APPEARANCE_HAIR_COLOR))); + character.getAppearance().setFace( + CharacterFace.valueOf(rs.getString(APPEARANCE_FACE))); + + return character; + } + }; + + @Override + public L2Character select(final CharacterID id) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public void load(final Clan clan) { + clan.getMembers().load( + database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT `" + CHAR_ID + "` FROM `" + TABLE + + "` WHERE `" + CLAN_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) + throws SQLException { + st.setInt(1, clan.getID().getID()); + } + + @Override + protected Mapper mapper() { + return idMapper; + } + })); + } + + @Override + public L2Character selectByName(final String name) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + NAME + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setString(1, name); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List selectByAccount(final AccountID account) { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + ACCOUNT_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setString(1, account.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List selectIDs() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT `" + CHAR_ID + "` FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return idMapper; + } + }); + } + + @Override + public boolean insert(L2Character character) { + return database.query(new InsertUpdateQuery(character) { + @Override + protected String query() { + return "INSERT INTO `" + TABLE + "` (`" + CHAR_ID + "`,`" + + ACCOUNT_ID + "`,`" + CLAN_ID + "`,`" + NAME + "`,`" + + RACE + "`,`" + CLASS + "`,`" + SEX + "`,`" + LEVEL + + "`,`" + EXPERIENCE + "`,`" + SP + "`,`" + HP + "`,`" + + MP + "`,`" + CP + "`,`" + POINT_X + "`,`" + POINT_Y + + "`,`" + POINT_Z + "`,`" + POINT_ANGLE + "`,`" + + APPEARANCE_HAIR_STYLE + "`,`" + APPEARANCE_HAIR_COLOR + + "`,`" + APPEARANCE_FACE + + "`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + } + + @Override + protected void parametize(PreparedStatement st, + L2Character character) throws SQLException { + final CharacterAppearance appearance = character + .getAppearance(); + int i = 1; + + st.setInt(i++, character.getID().getID()); + st.setString(i++, character.getAccountID().getID()); + if (character.getClanID() != null) + st.setInt(i++, character.getClanID().getID()); + else + st.setNull(i++, Types.INTEGER); + + st.setString(i++, character.getName()); + + st.setString(i++, character.getRace().name()); + st.setString(i++, character.getCharacterClass().name()); + st.setString(i++, character.getSex().name()); + + st.setInt(i++, character.getLevel()); + st.setLong(i++, character.getExperience()); + st.setInt(i++, character.getSP()); + + st.setDouble(i++, character.getHP()); + st.setDouble(i++, character.getMP()); + st.setDouble(i++, character.getCP()); + + st.setInt(i++, character.getPoint().getX()); + st.setInt(i++, character.getPoint().getY()); + st.setInt(i++, character.getPoint().getZ()); + st.setDouble(i++, character.getPoint().getAngle()); + + // appearance + st.setString(i++, appearance.getHairStyle().name()); + st.setString(i++, appearance.getHairColor().name()); + st.setString(i++, appearance.getFace().name()); + } + }) > 0; + } + + @Override + public boolean update(L2Character character) { + return database.query(new InsertUpdateQuery(character) { + @Override + protected String query() { + return "UPDATE `" + TABLE + "` SET " + ACCOUNT_ID + "` = ?,`" + + CLAN_ID + "` = ?,`" + NAME + "` = ?,`" + RACE + + "` = ?,`" + CLASS + "` = ?,`" + SEX + "` = ?,`" + + LEVEL + "` = ?,`" + EXPERIENCE + "` = ?,`" + SP + + "` = ?,`" + HP + "` = ?,`" + MP + "` = ?,`" + CP + + "` = ?,`" + POINT_X + "` = ?,`" + POINT_Y + "` = ?,`" + + POINT_Z + "` = ?,`" + POINT_ANGLE + "` = ?,`" + + APPEARANCE_HAIR_STYLE + "` = ?,`" + + APPEARANCE_HAIR_COLOR + "` = ?,`" + APPEARANCE_FACE + + "` = ? WHERE `" + CHAR_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, + L2Character character) throws SQLException { + final CharacterAppearance appearance = character + .getAppearance(); + int i = 1; + + // SET + st.setString(i++, character.getAccountID().getID()); + if (character.getClanID() != null) + st.setInt(i++, character.getClanID().getID()); + else + st.setNull(i++, Types.INTEGER); + + st.setString(i++, character.getName()); + + st.setString(i++, character.getRace().name()); + st.setString(i++, character.getCharacterClass().name()); + st.setString(i++, character.getSex().name()); + + st.setInt(i++, character.getLevel()); + st.setLong(i++, character.getExperience()); + st.setInt(i++, character.getSP()); + + st.setDouble(i++, character.getHP()); + st.setDouble(i++, character.getMP()); + st.setDouble(i++, character.getCP()); + + // position + st.setInt(i++, character.getPoint().getX()); + st.setInt(i++, character.getPoint().getY()); + st.setInt(i++, character.getPoint().getZ()); + st.setDouble(i++, character.getPoint().getAngle()); + + // appearance + st.setString(i++, appearance.getHairStyle().name()); + st.setString(i++, appearance.getHairColor().name()); + st.setString(i++, appearance.getFace().name()); + + // WHERE + st.setInt(i++, character.getID().getID()); + } + }) > 0; + } + + @Override + public boolean delete(L2Character character) { + return database.query(new InsertUpdateQuery(character) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, + L2Character character) throws SQLException { + st.setInt(1, character.getID().getID()); + } + }) > 0; + } +} diff --git a/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterFriendDAO.java b/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterFriendDAO.java new file mode 100644 index 000000000..f78b27538 --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/h2/H2CharacterFriendDAO.java @@ -0,0 +1,221 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao.h2; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterFriendDAO; +import com.l2jserver.model.game.CharacterFriend; +import com.l2jserver.model.id.FriendID; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.provider.CharacterIDProvider; +import com.l2jserver.model.id.provider.FriendIDProvider; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.character.CharacterFriendList; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; + +/** + * {@link CharacterFriendDAO} implementation for H2 + * + * @author Rogiel + */ +public class H2CharacterFriendDAO extends + AbstractH2DAO implements CharacterFriendDAO { + /** + * The {@link FriendID} provider + */ + private final FriendIDProvider idProvider; + /** + * The {@link CharacterID} provider + */ + private final CharacterIDProvider charIdProvider; + + /** + * Character table name + */ + public static final String TABLE = "character_friend"; + // FIELDS + public static final String CHAR_ID = H2CharacterDAO.CHAR_ID; + public static final String CHAR_ID_FRIEND = H2CharacterDAO.CHAR_ID + + "_friend"; + + @Inject + public H2CharacterFriendDAO(DatabaseService database, + final FriendIDProvider idProvider, + CharacterIDProvider charIdProvider) { + super(database); + this.idProvider = idProvider; + this.charIdProvider = charIdProvider; + } + + /** + * The {@link Mapper} for {@link FriendID} + */ + private final Mapper idMapper = new Mapper() { + @Override + public FriendID map(ResultSet rs) throws SQLException { + final CharacterID characterId = charIdProvider.createID(rs + .getInt(CHAR_ID)); + final CharacterID friendId = charIdProvider.createID(rs + .getInt(CHAR_ID_FRIEND)); + return idProvider.createID(characterId, friendId); + } + }; + + /** + * The {@link Mapper} for {@link CharacterFriend} + */ + private final Mapper mapper = new CachedMapper( + database, idMapper) { + @Override + protected CharacterFriend map(FriendID id, ResultSet rs) + throws SQLException { + return new CharacterFriend(id); + } + }; + + @Override + public CharacterFriend select(final FriendID id) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ? AND `" + CHAR_ID_FRIEND + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID1().getID()); + st.setInt(2, id.getID2().getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public void load(final L2Character character) { + final List list = database + .query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + + CHAR_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) + throws SQLException { + st.setInt(1, character.getID().getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + character.getFriendList().load(list); + } + + @Override + public List selectIDs() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return idMapper; + } + }); + } + + @Override + public boolean insert(CharacterFriend friend) { + return database.query(new InsertUpdateQuery(friend) { + @Override + protected String query() { + return "INSERT INTO `" + TABLE + "` (`" + CHAR_ID + "`,`" + + CHAR_ID_FRIEND + "`) VALUES(?,?)"; + } + + @Override + protected void parametize(PreparedStatement st, + CharacterFriend friend) throws SQLException { + st.setInt(1, friend.getCharacterID().getID()); + st.setInt(2, friend.getFriendID().getID()); + } + }) > 0; + } + + @Override + public boolean update(CharacterFriend friend) { + // it is not possible update friend objects, because they are only a ID + // pair and IDs are immutable + return false; + } + + @Override + public boolean delete(CharacterFriend friend) { + return database.query(new InsertUpdateQuery(friend) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?,`" + CHAR_ID_FRIEND + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, + CharacterFriend friend) throws SQLException { + st.setInt(1, friend.getCharacterID().getID()); + st.setInt(2, friend.getFriendID().getID()); + } + }) > 0; + } + + @Override + public boolean save(final CharacterFriendList friends) { + for (final CharacterFriend friend : friends) { + if (!save(friend)) + return false; + } + return true; + } + + @Override + public boolean delete(final CharacterFriendList friends) { + for (final CharacterFriend friend : friends) { + if (!delete(friend)) + return false; + } + return true; + } +} diff --git a/src/dao/h2/com/l2jserver/db/dao/h2/H2ClanDAO.java b/src/dao/h2/com/l2jserver/db/dao/h2/H2ClanDAO.java new file mode 100644 index 000000000..5b051c3d4 --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/h2/H2ClanDAO.java @@ -0,0 +1,170 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao.h2; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterDAO; +import com.l2jserver.db.dao.ClanDAO; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.ClanID; +import com.l2jserver.model.id.object.provider.CharacterIDProvider; +import com.l2jserver.model.id.object.provider.ClanIDProvider; +import com.l2jserver.model.world.Clan; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; + +/** + * {@link CharacterDAO} implementation for H2 + * + * @author Rogiel + */ +public class H2ClanDAO extends AbstractH2DAO implements ClanDAO { + /** + * The {@link ClanID} factory + */ + private final ClanIDProvider idFactory; + /** + * The {@link CharacterID} factory + */ + @SuppressWarnings("unused") + private final CharacterIDProvider charIdFactory; + + /** + * Character table name + */ + public static final String TABLE = "clan"; + // FIELDS + public static final String CLAN_ID = "clan_id"; + public static final String CHAR_ID_LEADER = "character_id_leader"; + + @Inject + public H2ClanDAO(DatabaseService database, ClanIDProvider clanIdFactory, + final CharacterIDProvider idFactory) { + super(database); + this.idFactory = clanIdFactory; + this.charIdFactory = idFactory; + } + + /** + * The {@link Mapper} for {@link ClanID} + */ + private final Mapper idMapper = new Mapper() { + @Override + public ClanID map(ResultSet rs) throws SQLException { + return idFactory.createID(rs.getInt(CLAN_ID)); + } + }; + + /** + * The {@link Mapper} for {@link Clan} + */ + private final Mapper mapper = new CachedMapper( + database, idMapper) { + @Override + protected Clan map(ClanID id, ResultSet rs) throws SQLException { + final Clan clan = new Clan(); + clan.setID(id); + return clan; + } + }; + + @Override + public Clan select(final ClanID id) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + CLAN_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List selectIDs() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return idMapper; + } + }); + } + + @Override + public boolean insert(Clan clan) { + return database.query(new InsertUpdateQuery(clan) { + @Override + protected String query() { + return "INSERT INTO `" + TABLE + "` (`" + CLAN_ID + + "`) VALUES(?)"; + } + + @Override + protected void parametize(PreparedStatement st, Clan clan) + throws SQLException { + int i = 1; + st.setInt(i++, clan.getID().getID()); + } + }) > 0; + } + + @Override + public boolean update(Clan clan) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean delete(Clan clan) { + return database.query(new InsertUpdateQuery(clan) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + CLAN_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, Clan clan) + throws SQLException { + st.setInt(1, clan.getID().getID()); + } + }) > 0; + } +} diff --git a/src/dao/h2/com/l2jserver/db/dao/h2/H2ItemDAO.java b/src/dao/h2/com/l2jserver/db/dao/h2/H2ItemDAO.java new file mode 100644 index 000000000..829a8cda1 --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/h2/H2ItemDAO.java @@ -0,0 +1,223 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao.h2; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.ItemDAO; +import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.model.id.object.ItemID; +import com.l2jserver.model.id.object.provider.CharacterIDProvider; +import com.l2jserver.model.id.object.provider.ItemIDProvider; +import com.l2jserver.model.id.template.ItemTemplateID; +import com.l2jserver.model.id.template.provider.ItemTemplateIDProvider; +import com.l2jserver.model.template.ItemTemplate; +import com.l2jserver.model.world.Item; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.character.CharacterInventory; +import com.l2jserver.model.world.character.CharacterInventory.InventoryLocation; +import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; +import com.l2jserver.util.dimensional.Coordinate; + +/** + * {@link ItemDAO} implementation for H2f + * + * @author Rogiel + */ +public class H2ItemDAO extends AbstractH2DAO implements + ItemDAO { + /** + * The {@link ItemID} factory + */ + private final ItemIDProvider idFactory; + /** + * The {@link ItemTemplateID} factory + */ + private final ItemTemplateIDProvider templateIdFactory; + /** + * The {@link CharacterID} factory + */ + private final CharacterIDProvider charIdFactory; + + /** + * Character table name + */ + public static final String TABLE = "item"; + // FIELDS + public static final String ITEM_ID = "item_id"; + public static final String TEMPLATE_ID = "template_id"; + public static final String CHAR_ID = H2CharacterDAO.CHAR_ID; + + public static final String LOCATION = "location"; + public static final String PAPERDOLL = "paperdoll"; + public static final String COUNT = "count"; + public static final String COORD_X = "coord_x"; + public static final String COORD_Y = "coord_y"; + public static final String COORD_Z = "coord_z"; + + @Inject + public H2ItemDAO(DatabaseService database, + final ItemIDProvider idFactory, + ItemTemplateIDProvider templateIdFactory, + CharacterIDProvider charIdFactory) { + super(database); + this.idFactory = idFactory; + this.templateIdFactory = templateIdFactory; + this.charIdFactory = charIdFactory; + } + + /** + * The {@link Mapper} for {@link ItemID} + */ + private final Mapper idMapper = new Mapper() { + @Override + public ItemID map(ResultSet rs) throws SQLException { + return idFactory.createID(rs.getInt(ITEM_ID)); + } + }; + + /** + * The {@link Mapper} instance + */ + private final Mapper mapper = new CachedMapper( + database, idMapper) { + @Override + public Item map(ItemID id, ResultSet rs) throws SQLException { + final ItemTemplateID templateId = templateIdFactory.createID(rs + .getInt(TEMPLATE_ID)); + final ItemTemplate template = templateId.getTemplate(); + final Item item = template.create(); + + item.setID(id); + if (rs.getObject(CHAR_ID) != null) + item.setOwnerID(charIdFactory.createID(rs.getInt(CHAR_ID))); + if (rs.getObject(LOCATION) != null) + item.setLocation(InventoryLocation.valueOf(rs + .getString(LOCATION))); + if (rs.getObject(PAPERDOLL) != null) + item.setPaperdoll(InventoryPaperdoll.valueOf(rs + .getString(PAPERDOLL))); + + item.setCount(rs.getInt(COUNT)); + + if (rs.getObject(COORD_X) != null && rs.getObject(COORD_Y) != null + && rs.getObject(COORD_Z) != null) + item.setPosition(Coordinate.fromXYZ(rs.getInt(COORD_X), + rs.getInt(COORD_Y), rs.getInt(COORD_Z))); + + return item; + } + }; + + @Override + public Item select(final ItemID id) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + ITEM_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public int loadInventory(final L2Character character) { + final CharacterInventory inventory = character.getInventory(); + final List items = database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + CHAR_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, character.getID().getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + inventory.load(items); + return items.size(); + } + + @Override + public List selectIDs() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT `" + ITEM_ID + "` FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return idMapper; + } + }); + } + + @Override + public boolean insert(Item item) { + throw new UnsupportedOperationException( + "Saving items is not yet implemented!"); + } + + @Override + public boolean update(Item item) { + return false; + } + + @Override + public boolean delete(Item item) { + return database.query(new InsertUpdateQuery(item) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + ITEM_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, Item item) + throws SQLException { + st.setInt(1, item.getID().getID()); + } + }) > 0; + } +} diff --git a/src/dao/h2/com/l2jserver/db/dao/h2/H2NPCDAO.java b/src/dao/h2/com/l2jserver/db/dao/h2/H2NPCDAO.java new file mode 100644 index 000000000..02971e1ec --- /dev/null +++ b/src/dao/h2/com/l2jserver/db/dao/h2/H2NPCDAO.java @@ -0,0 +1,265 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.db.dao.h2; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.inject.Inject; +import com.l2jserver.db.dao.CharacterDAO; +import com.l2jserver.db.dao.NPCDAO; +import com.l2jserver.model.id.object.NPCID; +import com.l2jserver.model.id.object.provider.NPCIDProvider; +import com.l2jserver.model.id.template.NPCTemplateID; +import com.l2jserver.model.id.template.provider.NPCTemplateIDProvider; +import com.l2jserver.model.template.NPCTemplate; +import com.l2jserver.model.world.NPC; +import com.l2jserver.service.database.DatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; +import com.l2jserver.util.dimensional.Point; + +/** + * {@link CharacterDAO} implementation for H2 + * + * @author Rogiel + */ +public class H2NPCDAO extends AbstractH2DAO implements NPCDAO { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * The {@link NPCID} provider + */ + private final NPCIDProvider idProvider; + /** + * The {@link NPCTemplateID} provider + */ + private final NPCTemplateIDProvider templateIdProvider; + + /** + * Character table name + */ + public static final String TABLE = "npc"; + // FIELDS + public static final String NPC_ID = "npc_id"; + public static final String NPC_TEMPLATE_ID = "npc_template_id"; + + public static final String POINT_X = "point_x"; + public static final String POINT_Y = "point_y"; + public static final String POINT_Z = "point_z"; + public static final String POINT_ANGLE = "point_angle"; + + @Inject + public H2NPCDAO(DatabaseService database, final NPCIDProvider idProvider, + NPCTemplateIDProvider templateIdProvider) { + super(database); + this.idProvider = idProvider; + this.templateIdProvider = templateIdProvider; + } + + /** + * The {@link Mapper} for {@link NPCID} + */ + private final Mapper idMapper = new Mapper() { + @Override + public NPCID map(ResultSet rs) throws SQLException { + if (rs.getString(NPC_ID) == null) + return null; + return idProvider.createID(rs.getInt(NPC_ID)); + } + }; + + /** + * The {@link Mapper} for {@link NPC} + */ + private final Mapper mapper = new CachedMapper(database, + idMapper) { + @Override + protected NPC map(NPCID id, ResultSet rs) throws SQLException { + NPCTemplateID templateId = templateIdProvider.createID(rs + .getInt(NPC_TEMPLATE_ID)); + NPCTemplate template = templateId.getTemplate(); + if (template == null) { + // set default npc instance, for now! + // RoxxyGatekeeperTemplate - 30006 + log.warn("No template found for {}", templateId); + return null; + } + + final NPC npc = template.create(); + + npc.setID(id); + npc.setPoint(Point.fromXYZA(rs.getInt(POINT_X), rs.getInt(POINT_Y), + rs.getInt(POINT_Z), rs.getDouble(POINT_ANGLE))); + + return npc; + } + }; + + @Override + public NPC select(final NPCID id) { + return database.query(new SelectSingleQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + NPC_ID + + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, id.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List loadAll() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List selectByTemplate(final NPCTemplateID template) { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT * FROM `" + TABLE + "` WHERE `" + + NPC_TEMPLATE_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st) throws SQLException { + st.setInt(1, template.getID()); + } + + @Override + protected Mapper mapper() { + return mapper; + } + }); + } + + @Override + public List selectIDs() { + return database.query(new SelectListQuery() { + @Override + protected String query() { + return "SELECT `" + NPC_ID + "` FROM `" + TABLE + "`"; + } + + @Override + protected Mapper mapper() { + return idMapper; + } + }); + } + + @Override + public boolean insert(NPC npc) { + return database.query(new InsertUpdateQuery(npc) { + @Override + protected String query() { + return "INSERT INTO `" + TABLE + "` (`" + NPC_ID + "`,`" + + NPC_TEMPLATE_ID + "`,`" + POINT_X + "`,`" + POINT_Y + + "`,`" + POINT_Z + "`,`" + POINT_ANGLE + + "`) VALUES(?,?,?,?,?,?)"; + } + + @Override + protected void parametize(PreparedStatement st, NPC npc) + throws SQLException { + int i = 1; + + st.setInt(i++, npc.getID().getID()); + st.setInt(i++, npc.getTemplateID().getID()); + + st.setInt(i++, npc.getPoint().getX()); + st.setInt(i++, npc.getPoint().getY()); + st.setInt(i++, npc.getPoint().getZ()); + st.setDouble(i++, npc.getPoint().getAngle()); + } + }) > 0; + } + + @Override + public boolean update(NPC npc) { + return database.query(new InsertUpdateQuery(npc) { + @Override + protected String query() { + return "UPDATE `" + TABLE + "` SET " + NPC_TEMPLATE_ID + + "` = ?,`" + POINT_X + "` = ?,`" + POINT_Y + "` = ?,`" + + POINT_Z + "` = ?,`" + POINT_ANGLE + "` = ? WHERE `" + + NPC_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, NPC npc) + throws SQLException { + int i = 1; + + // SET + st.setInt(i++, npc.getTemplateID().getID()); + + st.setInt(i++, npc.getPoint().getX()); + st.setInt(i++, npc.getPoint().getY()); + st.setInt(i++, npc.getPoint().getZ()); + st.setDouble(i++, npc.getPoint().getAngle()); + + // WHERE + st.setInt(i++, npc.getID().getID()); + } + }) > 0; + } + + @Override + public boolean delete(NPC npc) { + return database.query(new InsertUpdateQuery(npc) { + @Override + protected String query() { + return "DELETE FROM `" + TABLE + "` WHERE `" + NPC_ID + "` = ?"; + } + + @Override + protected void parametize(PreparedStatement st, NPC npc) + throws SQLException { + st.setInt(1, npc.getID().getID()); + } + }) > 0; + } +} diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/AbstractMySQL5DAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/AbstractMySQL5DAO.java index 519a573d4..465492d99 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/AbstractMySQL5DAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/AbstractMySQL5DAO.java @@ -21,7 +21,7 @@ import com.l2jserver.model.Model; import com.l2jserver.model.id.ID; import com.l2jserver.service.database.AbstractDAO; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService; /** * {@link AbstractDAO} for MySQL DAO implementation @@ -38,11 +38,11 @@ public abstract class AbstractMySQL5DAO, I extends ID> /** * The MySQL Database Service */ - protected final MySQLDatabaseService database; + protected final JDBCDatabaseService database; @Inject protected AbstractMySQL5DAO(DatabaseService database) { super(database); - this.database = (MySQLDatabaseService) database; + this.database = (JDBCDatabaseService) database; } } diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java index ce29f12c5..6b1747442 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterDAO.java @@ -43,11 +43,11 @@ import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairColo import com.l2jserver.model.world.character.CharacterAppearance.CharacterHairStyle; import com.l2jserver.model.world.character.CharacterClass; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService.CachedMapper; -import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; -import com.l2jserver.service.database.MySQLDatabaseService.Mapper; -import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; -import com.l2jserver.service.database.MySQLDatabaseService.SelectSingleQuery; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; import com.l2jserver.util.dimensional.Point; /** diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java index 294219a49..df9d3885c 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5CharacterFriendDAO.java @@ -31,11 +31,11 @@ import com.l2jserver.model.id.provider.FriendIDProvider; import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.character.CharacterFriendList; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService.CachedMapper; -import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; -import com.l2jserver.service.database.MySQLDatabaseService.Mapper; -import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; -import com.l2jserver.service.database.MySQLDatabaseService.SelectSingleQuery; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; /** * {@link CharacterFriendDAO} implementation for MySQL5 diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ClanDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ClanDAO.java index 3893246fd..a8cbfb224 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ClanDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ClanDAO.java @@ -30,11 +30,11 @@ import com.l2jserver.model.id.object.provider.CharacterIDProvider; import com.l2jserver.model.id.object.provider.ClanIDProvider; import com.l2jserver.model.world.Clan; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService.CachedMapper; -import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; -import com.l2jserver.service.database.MySQLDatabaseService.Mapper; -import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; -import com.l2jserver.service.database.MySQLDatabaseService.SelectSingleQuery; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; /** * {@link CharacterDAO} implementation for MySQL5 diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ItemDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ItemDAO.java index 2f53288b0..457f0f900 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ItemDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5ItemDAO.java @@ -36,11 +36,11 @@ import com.l2jserver.model.world.character.CharacterInventory; import com.l2jserver.model.world.character.CharacterInventory.InventoryLocation; import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService.CachedMapper; -import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; -import com.l2jserver.service.database.MySQLDatabaseService.Mapper; -import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; -import com.l2jserver.service.database.MySQLDatabaseService.SelectSingleQuery; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; import com.l2jserver.util.dimensional.Coordinate; /** diff --git a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5NPCDAO.java b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5NPCDAO.java index 6e3ad86b1..23fffe37e 100644 --- a/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5NPCDAO.java +++ b/src/dao/mysql5/com/l2jserver/db/dao/mysql5/MySQL5NPCDAO.java @@ -34,11 +34,11 @@ import com.l2jserver.model.id.template.provider.NPCTemplateIDProvider; import com.l2jserver.model.template.NPCTemplate; import com.l2jserver.model.world.NPC; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService.CachedMapper; -import com.l2jserver.service.database.MySQLDatabaseService.InsertUpdateQuery; -import com.l2jserver.service.database.MySQLDatabaseService.Mapper; -import com.l2jserver.service.database.MySQLDatabaseService.SelectListQuery; -import com.l2jserver.service.database.MySQLDatabaseService.SelectSingleQuery; +import com.l2jserver.service.database.JDBCDatabaseService.CachedMapper; +import com.l2jserver.service.database.JDBCDatabaseService.InsertUpdateQuery; +import com.l2jserver.service.database.JDBCDatabaseService.Mapper; +import com.l2jserver.service.database.JDBCDatabaseService.SelectListQuery; +import com.l2jserver.service.database.JDBCDatabaseService.SelectSingleQuery; import com.l2jserver.util.dimensional.Point; /** diff --git a/src/main/java/com/l2jserver/GameServerModule.java b/src/main/java/com/l2jserver/GameServerModule.java index d721e8b79..918eb44ca 100644 --- a/src/main/java/com/l2jserver/GameServerModule.java +++ b/src/main/java/com/l2jserver/GameServerModule.java @@ -18,7 +18,7 @@ package com.l2jserver; import com.google.inject.AbstractModule; import com.google.inject.Module; -import com.l2jserver.db.dao.MySQL5DAOModule; +import com.l2jserver.db.dao.H2DAOModule; import com.l2jserver.model.id.provider.IDProviderModule; import com.l2jserver.service.ServiceModule; @@ -32,6 +32,6 @@ public class GameServerModule extends AbstractModule { protected void configure() { install(new ServiceModule()); install(new IDProviderModule()); - install(new MySQL5DAOModule()); + install(new H2DAOModule()); } } diff --git a/src/main/java/com/l2jserver/L2JGameServerMain.java b/src/main/java/com/l2jserver/L2JGameServerMain.java index 85408b10d..9c266fae3 100644 --- a/src/main/java/com/l2jserver/L2JGameServerMain.java +++ b/src/main/java/com/l2jserver/L2JGameServerMain.java @@ -59,15 +59,11 @@ public class L2JGameServerMain { // spawn serviceManager.get(NPCService.class).spawnAll(); - - // staticSpawn(server.getInjector()); } catch (Exception e) { System.out.println("GameServer could not be started!"); e.printStackTrace(); System.exit(0); } - - // Thread.sleep(60 * 60 * 1000); } // // /** diff --git a/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java index 1d6078abc..3c246eee3 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/AuthLoginPacket.java @@ -87,9 +87,7 @@ public class AuthLoginPacket extends AbstractClientPacket { final List chars = characterDao.selectByAccount(accountId); conn.write(CharacterSelectionListPacket.fromL2Session( - conn.getSession(), chars.get(0))); - // conn.setCharacterID(chars.get(0).getID()); - // conn.write(new CharacterEnterWorldPacket(chars.get(0), playKey1)); + conn.getSession(), chars.toArray(new L2Character[chars.size()]))); } /** diff --git a/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java b/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java index 0b2aca8fd..f79989333 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/CharacterCreatePacket.java @@ -70,7 +70,7 @@ public class CharacterCreatePacket extends AbstractClientPacket { /** * The {@link CharacterTemplateID} factory */ - private final CharacterTemplateIDProvider characterTemplateIdFactory; + private final CharacterTemplateIDProvider characterTemplateIdProvider; // packet /** @@ -140,7 +140,7 @@ public class CharacterCreatePacket extends AbstractClientPacket { CharacterTemplateIDProvider characterTemplateIdFactory) { this.characterDao = characterDao; this.characterIdFactory = characterIdFactory; - this.characterTemplateIdFactory = characterTemplateIdFactory; + this.characterTemplateIdProvider = characterTemplateIdFactory; } @Override @@ -192,7 +192,7 @@ public class CharacterCreatePacket extends AbstractClientPacket { } // create template id and lookup for the template instance - final CharacterTemplateID templateId = characterTemplateIdFactory + final CharacterTemplateID templateId = characterTemplateIdProvider .createID(characterClass.id); final CharacterTemplate template = templateId.getTemplate(); log.debug("Creating character with template {}", template); diff --git a/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java index 50a2c51b5..c657bb905 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/RequestCharacterTemplatesPacket.java @@ -76,13 +76,13 @@ public class RequestCharacterTemplatesPacket extends AbstractClientPacket { @Override public void process(final Lineage2Connection conn) { log.debug("Requested character templates"); + + final CharacterTemplate[] templates = new CharacterTemplate[TEMPLATE_CLASSES.length]; + int i = 0; for (final CharacterClass charClass : TEMPLATE_CLASSES) { final CharacterTemplateID id = idFactory.createID(charClass.id); - final CharacterTemplate template = id.getTemplate(); - final CharacterTemplatePacket templatePacket = new CharacterTemplatePacket( - template); - - conn.write(templatePacket); + templates[i++] = id.getTemplate(); } + conn.write(new CharacterTemplatePacket(templates)); } } diff --git a/src/main/java/com/l2jserver/model/AbstractModel.java b/src/main/java/com/l2jserver/model/AbstractModel.java index 0b7fa6802..049f437b5 100644 --- a/src/main/java/com/l2jserver/model/AbstractModel.java +++ b/src/main/java/com/l2jserver/model/AbstractModel.java @@ -32,7 +32,7 @@ public abstract class AbstractModel> implements Model { /** * The database object state */ - protected ObjectState state = ObjectState.NOT_STORED; + protected transient ObjectState state = ObjectState.NOT_STORED; @Override public T getID() { diff --git a/src/main/java/com/l2jserver/model/id/object/CharacterID.java b/src/main/java/com/l2jserver/model/id/object/CharacterID.java index ff66b491f..9911df3a7 100644 --- a/src/main/java/com/l2jserver/model/id/object/CharacterID.java +++ b/src/main/java/com/l2jserver/model/id/object/CharacterID.java @@ -31,7 +31,7 @@ public final class CharacterID extends ActorID { /** * Data Access Object (DAO) for characters */ - private final CharacterDAO characterDao; + private transient final CharacterDAO characterDao; @Inject public CharacterID(@Assisted int id, CharacterDAO characterDao) { diff --git a/src/main/java/com/l2jserver/model/id/template/ActorTemplateID.java b/src/main/java/com/l2jserver/model/id/template/ActorTemplateID.java index 724c2cdf4..fb8141430 100644 --- a/src/main/java/com/l2jserver/model/id/template/ActorTemplateID.java +++ b/src/main/java/com/l2jserver/model/id/template/ActorTemplateID.java @@ -29,11 +29,12 @@ import com.l2jserver.service.game.template.TemplateService; * * @author Rogiel */ -public class ActorTemplateID> extends TemplateID { +public class ActorTemplateID> extends + TemplateID { /** * The template service */ - private final TemplateService templateService; + private transient final TemplateService templateService; @Inject protected ActorTemplateID(@Assisted int id, TemplateService templateService) { diff --git a/src/main/java/com/l2jserver/model/id/template/CharacterTemplateID.java b/src/main/java/com/l2jserver/model/id/template/CharacterTemplateID.java index d7a75990e..2b09db1ce 100644 --- a/src/main/java/com/l2jserver/model/id/template/CharacterTemplateID.java +++ b/src/main/java/com/l2jserver/model/id/template/CharacterTemplateID.java @@ -30,7 +30,7 @@ import com.l2jserver.service.game.template.TemplateService; */ public class CharacterTemplateID extends ActorTemplateID { @Inject - protected CharacterTemplateID(@Assisted int id, + public CharacterTemplateID(@Assisted int id, TemplateService templateService) { super(id, templateService); } diff --git a/src/main/java/com/l2jserver/model/template/CharacterTemplate.java b/src/main/java/com/l2jserver/model/template/CharacterTemplate.java index 0a54639ec..973b9b251 100644 --- a/src/main/java/com/l2jserver/model/template/CharacterTemplate.java +++ b/src/main/java/com/l2jserver/model/template/CharacterTemplate.java @@ -31,7 +31,8 @@ import com.l2jserver.model.world.character.CharacterClass; import com.l2jserver.util.jaxb.CharacterTemplateIDAdapter; /** - * The {@link L2Character} template. Each character instance is backed by an template. + * The {@link L2Character} template. Each character instance is backed by an + * template. * * @author Rogiel */ @@ -43,9 +44,6 @@ public class CharacterTemplate extends ActorTemplate { @XmlAttribute(name = "class") protected CharacterTemplateID id = null; - @XmlAttribute(name = "class") - protected CharacterClass characterClass = null; - @XmlElement(name = "stats") protected CharacterStatsMetadata stats = null; @@ -181,14 +179,14 @@ public class CharacterTemplate extends ActorTemplate { * @return the character Class */ public CharacterClass getCharacterClass() { - return characterClass; + return CharacterClass.fromID(id.getID()); } /** * @return the character race */ public ActorRace getRace() { - return characterClass.race; + return getCharacterClass().race; } /** diff --git a/src/main/java/com/l2jserver/model/world/L2Character.java b/src/main/java/com/l2jserver/model/world/L2Character.java index 8d1e097fb..9c028e5b3 100644 --- a/src/main/java/com/l2jserver/model/world/L2Character.java +++ b/src/main/java/com/l2jserver/model/world/L2Character.java @@ -97,11 +97,6 @@ public class L2Character extends Player { */ private Date lastAccess; - /** - * The character stat - */ - private final CharacterStats stats = new CharacterStats(this); - /** * The character karma points */ @@ -118,12 +113,16 @@ public class L2Character extends Player { // //////////////////////////////////// // / RUNTIME // //////////////////////////////////// + /** + * The character stat + */ + private transient final CharacterStats stats = new CharacterStats(this); /** * The character walk mode. *

* This field is not persisted. */ - private CharacterMoveType moveType = CharacterMoveType.WALK; + private transient CharacterMoveType moveType = CharacterMoveType.WALK; /** * The character walking mode @@ -143,11 +142,11 @@ public class L2Character extends Player { /** * The character target, if any. */ - private ActorID targetID; + private transient ActorID targetID; /** * State of the character. Will be null if it is idle */ - private CharacterState state; + private transient CharacterState state; /** * The valid states for an character @@ -180,7 +179,7 @@ public class L2Character extends Player { /** * The point the player is moving, teleporting etc... */ - private Point targetLocation; + private transient Point targetLocation; /** * Creates a new instance diff --git a/src/main/java/com/l2jserver/model/world/character/CharacterInventory.java b/src/main/java/com/l2jserver/model/world/character/CharacterInventory.java index d5cbd88cf..471e9b0bf 100644 --- a/src/main/java/com/l2jserver/model/world/character/CharacterInventory.java +++ b/src/main/java/com/l2jserver/model/world/character/CharacterInventory.java @@ -16,8 +16,8 @@ */ package com.l2jserver.model.world.character; +import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.Set; import com.l2jserver.model.world.Item; @@ -76,7 +76,7 @@ public class CharacterInventory implements Iterable { * @param items * the items to be added */ - public void load(List items) { + public void load(Collection items) { this.items.clear(); this.items.addAll(items); } diff --git a/src/main/java/com/l2jserver/service/ServiceModule.java b/src/main/java/com/l2jserver/service/ServiceModule.java index 1bbd082e9..d2669b98a 100644 --- a/src/main/java/com/l2jserver/service/ServiceModule.java +++ b/src/main/java/com/l2jserver/service/ServiceModule.java @@ -28,7 +28,7 @@ import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.core.vfs.VFSService; import com.l2jserver.service.core.vfs.VFSServiceImpl; import com.l2jserver.service.database.DatabaseService; -import com.l2jserver.service.database.MySQLDatabaseService; +import com.l2jserver.service.database.JDBCDatabaseService; import com.l2jserver.service.game.character.CharacterService; import com.l2jserver.service.game.character.CharacterServiceImpl; import com.l2jserver.service.game.chat.ChatService; @@ -69,7 +69,7 @@ public class ServiceModule extends AbstractModule { bind(ConfigurationService.class).to(ProxyConfigurationService.class) .in(Scopes.SINGLETON); bind(CacheService.class).to(EhCacheService.class).in(Scopes.SINGLETON); - bind(DatabaseService.class).to(MySQLDatabaseService.class).in( + bind(DatabaseService.class).to(JDBCDatabaseService.class).in( Scopes.SINGLETON); bind(WorldIDService.class).to(CachedWorldIDService.class).in( Scopes.SINGLETON); diff --git a/src/main/java/com/l2jserver/service/core/vfs/VFSServiceImpl.java b/src/main/java/com/l2jserver/service/core/vfs/VFSServiceImpl.java index f902003ca..60f8e7931 100644 --- a/src/main/java/com/l2jserver/service/core/vfs/VFSServiceImpl.java +++ b/src/main/java/com/l2jserver/service/core/vfs/VFSServiceImpl.java @@ -24,6 +24,8 @@ import org.apache.commons.vfs.FileSystemException; import org.apache.commons.vfs.FileSystemManager; import org.apache.commons.vfs.impl.DefaultFileSystemManager; import org.apache.commons.vfs.impl.StandardFileSystemManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.l2jserver.service.AbstractService; import com.l2jserver.service.ServiceStartException; @@ -35,6 +37,11 @@ import com.l2jserver.service.ServiceStopException; * @author Rogiel */ public class VFSServiceImpl extends AbstractService implements VFSService { + /** + * The logger + */ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + /** * The CommonsVFS {@link FileSystemManager} */ @@ -62,6 +69,7 @@ public class VFSServiceImpl extends AbstractService implements VFSService { try { return manager.resolveFile(uri); } catch (FileSystemException e) { + log.error("Error resolving file", e); return null; } } diff --git a/src/main/java/com/l2jserver/service/database/DB4ODatabaseService.java b/src/main/java/com/l2jserver/service/database/DB4ODatabaseService.java deleted file mode 100644 index 8c8056ae1..000000000 --- a/src/main/java/com/l2jserver/service/database/DB4ODatabaseService.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of l2jserver . - * - * l2jserver is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * l2jserver is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with l2jserver. If not, see . - */ -package com.l2jserver.service.database; - -import com.l2jserver.service.AbstractService; - -/** - * Database service implementation for DB4O database engine. - *

- * Note that this is not implemented yet! - * - * @author Rogiel - */ -public class DB4ODatabaseService extends AbstractService implements - DatabaseService { - @Override - public Object getCachedObject(Object id) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasCachedObject(Object id) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void updateCache(Object key, Object value) { - // TODO Auto-generated method stub - - } - - @Override - public void removeCache(Object key) { - // TODO Auto-generated method stub - - } -} diff --git a/src/main/java/com/l2jserver/service/database/DataAccessObject.java b/src/main/java/com/l2jserver/service/database/DataAccessObject.java index b49ce3afa..711951636 100644 --- a/src/main/java/com/l2jserver/service/database/DataAccessObject.java +++ b/src/main/java/com/l2jserver/service/database/DataAccessObject.java @@ -16,8 +16,8 @@ */ package com.l2jserver.service.database; +import java.util.Collection; import java.util.Iterator; -import java.util.List; import com.l2jserver.model.Model; import com.l2jserver.model.id.ID; @@ -56,7 +56,7 @@ public interface DataAccessObject, I extends ID> extends * @return the list containing all {@link ID} objects */ @IgnoreCaching - List selectIDs(); + Collection selectIDs(); /** * Save the instance to the database. If a new database entry was created diff --git a/src/main/java/com/l2jserver/service/database/DatabaseService.java b/src/main/java/com/l2jserver/service/database/DatabaseService.java index 6891cd0fa..5bb965d38 100644 --- a/src/main/java/com/l2jserver/service/database/DatabaseService.java +++ b/src/main/java/com/l2jserver/service/database/DatabaseService.java @@ -25,40 +25,5 @@ import com.l2jserver.service.Service; * @author Rogiel */ public interface DatabaseService extends Service { - /** - * Get the database object cached. Will return null if the object is not in - * cache - * - * @param id - * the object id - * @return the cached object - */ - Object getCachedObject(Object id); - - /** - * Tests if the object is cached - * - * @param id - * the object id - * @return true if object is in cache - */ - boolean hasCachedObject(Object id); - - /** - * Adds or update the cache object - * - * @param key - * the cache key - * @param value - * the object - */ - void updateCache(Object key, Object value); - - /** - * Removes an object from the cache - * - * @param key - * the cache key - */ - void removeCache(Object key); + void install(); } diff --git a/src/main/java/com/l2jserver/service/database/MySQLDatabaseConfiguration.java b/src/main/java/com/l2jserver/service/database/JDBCDatabaseConfiguration.java similarity index 59% rename from src/main/java/com/l2jserver/service/database/MySQLDatabaseConfiguration.java rename to src/main/java/com/l2jserver/service/database/JDBCDatabaseConfiguration.java index 32988c85a..b22ce5ed9 100644 --- a/src/main/java/com/l2jserver/service/database/MySQLDatabaseConfiguration.java +++ b/src/main/java/com/l2jserver/service/database/JDBCDatabaseConfiguration.java @@ -17,60 +17,60 @@ package com.l2jserver.service.database; /** - * Configuration interface for {@link MySQLDatabaseService}. + * Configuration interface for {@link JDBCDatabaseService}. * * @author Rogiel */ -public interface MySQLDatabaseConfiguration extends DatabaseConfiguration { +public interface JDBCDatabaseConfiguration extends DatabaseConfiguration { /** * @return the jdbc url */ - @ConfigurationPropertyGetter(name = "jdbc.mysql.url", defaultValue = "jdbc:mysql://localhost/l2jserver2") + @ConfigurationPropertyGetter(name = "jdbc.url", defaultValue = "jdbc:mysql://localhost/l2jserver2") String getJdbcUrl(); /** * @param jdbcUrl * the new jdbc url */ - @ConfigurationPropertySetter(name = "jdbc.mysql.url") + @ConfigurationPropertySetter(name = "jdbc.url") void setJdbcUrl(String jdbcUrl); /** * @return the jdbc driver class */ - @ConfigurationPropertyGetter(name = "jdbc.mysql.driver", defaultValue = "com.mysql.jdbc.Driver") + @ConfigurationPropertyGetter(name = "jdbc.driver", defaultValue = "com.jdbc.jdbc.Driver") String getDriver(); /** * @param driver * the new jdbc driver */ - @ConfigurationPropertySetter(name = "jdbc.mysql.driver") + @ConfigurationPropertySetter(name = "jdbc.driver") void setDriver(Class driver); /** - * @return the mysql database username + * @return the jdbc database username */ - @ConfigurationPropertyGetter(name = "jdbc.mysql.username", defaultValue = "l2j") + @ConfigurationPropertyGetter(name = "jdbc.username", defaultValue = "l2j") String getUsername(); /** * @param username - * the mysql database username + * the jdbc database username */ - @ConfigurationPropertySetter(name = "jdbc.mysql.username") + @ConfigurationPropertySetter(name = "jdbc.username") void setUsername(String username); /** - * @return the mysql database password + * @return the jdbc database password */ - @ConfigurationPropertyGetter(name = "jdbc.mysql.password", defaultValue = "changeme") + @ConfigurationPropertyGetter(name = "jdbc.password", defaultValue = "changeme") String getPassword(); /** * @param password - * the mysql database password + * the jdbc database password */ - @ConfigurationPropertySetter(name = "jdbc.mysql.password") + @ConfigurationPropertySetter(name = "jdbc.password") void setPassword(String password); } diff --git a/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java b/src/main/java/com/l2jserver/service/database/JDBCDatabaseService.java similarity index 92% rename from src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java rename to src/main/java/com/l2jserver/service/database/JDBCDatabaseService.java index 587720b4c..438ae9e01 100644 --- a/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java +++ b/src/main/java/com/l2jserver/service/database/JDBCDatabaseService.java @@ -16,10 +16,13 @@ */ package com.l2jserver.service.database; +import java.io.File; +import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -34,6 +37,7 @@ import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; +import org.apache.commons.io.FileUtils; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.slf4j.Logger; @@ -63,18 +67,18 @@ import com.l2jserver.util.factory.CollectionFactory; */ @Depends({ LoggingService.class, CacheService.class, ConfigurationService.class, TemplateService.class }) -public class MySQLDatabaseService extends AbstractService implements +public class JDBCDatabaseService extends AbstractService implements DatabaseService { /** * The configuration object */ - private final MySQLDatabaseConfiguration config; + private final JDBCDatabaseConfiguration config; /** * The logger */ private final Logger logger = LoggerFactory - .getLogger(MySQLDatabaseService.class); - // services + .getLogger(JDBCDatabaseService.class); + /** * The cache service */ @@ -104,9 +108,9 @@ public class MySQLDatabaseService extends AbstractService implements private Cache objectCache; @Inject - public MySQLDatabaseService(ConfigurationService configService, + public JDBCDatabaseService(ConfigurationService configService, CacheService cacheService) { - config = configService.get(MySQLDatabaseConfiguration.class); + config = configService.get(JDBCDatabaseConfiguration.class); this.cacheService = cacheService; } @@ -129,6 +133,30 @@ public class MySQLDatabaseService extends AbstractService implements cacheService.register(objectCache); } + @Override + public void install() { + @SuppressWarnings("unchecked") + Collection files = FileUtils.listFiles(new File("dist/sql/h2"), + new String[] { "sql" }, false); + try { + final Connection conn = dataSource.getConnection(); + try { + for (final File file : files) { + conn.createStatement().execute( + FileUtils.readFileToString(file)); + } + } finally { + conn.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + return; + } catch (IOException e) { + e.printStackTrace(); + return; + } + } + /** * Executes an query in the database. * @@ -156,7 +184,6 @@ public class MySQLDatabaseService extends AbstractService implements } } - @Override public Object getCachedObject(Object id) { Preconditions.checkNotNull(id, "id"); final Element element = objectCache.get(id); @@ -165,20 +192,17 @@ public class MySQLDatabaseService extends AbstractService implements return element.getObjectValue(); } - @Override public boolean hasCachedObject(Object id) { Preconditions.checkNotNull(id, "id"); return objectCache.get(id) != null; } - @Override public void updateCache(Object key, Object value) { Preconditions.checkNotNull(key, "key"); Preconditions.checkNotNull(value, "value"); objectCache.put(new Element(key, value)); } - @Override public void removeCache(Object key) { Preconditions.checkNotNull(key, "key"); objectCache.remove(key); @@ -189,6 +213,7 @@ public class MySQLDatabaseService extends AbstractService implements if (objectCache != null) objectCache.dispose(); objectCache = null; + try { if (connectionPool != null) connectionPool.close(); @@ -473,7 +498,7 @@ public class MySQLDatabaseService extends AbstractService implements /** * The database service instance */ - private final MySQLDatabaseService database; + private final JDBCDatabaseService database; private final Mapper idMapper; @@ -483,7 +508,7 @@ public class MySQLDatabaseService extends AbstractService implements * @param database * the database service */ - public CachedMapper(MySQLDatabaseService database, Mapper idMapper) { + public CachedMapper(JDBCDatabaseService database, Mapper idMapper) { this.database = database; this.idMapper = idMapper; } diff --git a/src/main/java/com/l2jserver/service/game/npc/NPCService.java b/src/main/java/com/l2jserver/service/game/npc/NPCService.java index 3820eac04..e6e63ae37 100644 --- a/src/main/java/com/l2jserver/service/game/npc/NPCService.java +++ b/src/main/java/com/l2jserver/service/game/npc/NPCService.java @@ -16,7 +16,7 @@ */ package com.l2jserver.service.game.npc; -import java.util.List; +import java.util.Collection; import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.client.CharacterActionPacket.CharacterAction; @@ -69,7 +69,7 @@ public interface NPCService extends Service { * @throws SpawnPointNotFoundServiceException * if one of the NPCs does not have an spawn point defined */ - List spawnAll() throws SpawnPointNotFoundServiceException, + Collection spawnAll() throws SpawnPointNotFoundServiceException, AlreadySpawnedServiceException; /** diff --git a/src/main/java/com/l2jserver/service/game/npc/NPCServiceImpl.java b/src/main/java/com/l2jserver/service/game/npc/NPCServiceImpl.java index 689457d4a..045b2c58a 100644 --- a/src/main/java/com/l2jserver/service/game/npc/NPCServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/npc/NPCServiceImpl.java @@ -16,7 +16,7 @@ */ package com.l2jserver.service.game.npc; -import java.util.List; +import java.util.Collection; import java.util.Map; import com.google.common.base.Preconditions; @@ -123,9 +123,9 @@ public class NPCServiceImpl extends AbstractService implements NPCService { } @Override - public List spawnAll() throws SpawnPointNotFoundServiceException, + public Collection spawnAll() throws SpawnPointNotFoundServiceException, AlreadySpawnedServiceException { - final List npcs = npcDao.loadAll(); + final Collection npcs = npcDao.loadAll(); for (final NPC npc : npcs) { spawnService.spawn(npc, null); } diff --git a/src/main/java/com/l2jserver/service/game/template/XMLTemplateServiceConfiguration.java b/src/main/java/com/l2jserver/service/game/template/XMLTemplateServiceConfiguration.java index 696d4e75a..d784a67f2 100644 --- a/src/main/java/com/l2jserver/service/game/template/XMLTemplateServiceConfiguration.java +++ b/src/main/java/com/l2jserver/service/game/template/XMLTemplateServiceConfiguration.java @@ -23,7 +23,7 @@ import com.l2jserver.service.configuration.Configuration.ConfigurationName; @ConfigurationName("template") public interface XMLTemplateServiceConfiguration extends Configuration { - @ConfigurationPropertyGetter(name = "template.directory", defaultValue = "zip:data/templates.zip") + @ConfigurationPropertyGetter(name = "template.directory", defaultValue = "data/templates") URI getTemplateDirectory(); @ConfigurationPropertySetter(name = "template.directory") diff --git a/src/main/java/com/l2jserver/test/XMLMappingTest.java b/src/main/java/com/l2jserver/test/XMLMappingTest.java index 0e1492676..2995f022d 100644 --- a/src/main/java/com/l2jserver/test/XMLMappingTest.java +++ b/src/main/java/com/l2jserver/test/XMLMappingTest.java @@ -71,8 +71,9 @@ public class XMLMappingTest { // // System.out.println("Took " + ((end - start) / 1000) + " seconds"); - final NPCTemplate t = (NPCTemplate) u - .unmarshal(new File("data/templates/npc/teleporter/30059-Trisha.xml")); - System.out.println(t.getControllerClass()); + final CharacterTemplate t = (CharacterTemplate) u.unmarshal(new File( + "data/templates/character/HumanFighter.xml")); + System.out.println(t.getID()); + System.out.println(t.getCharacterClass()); } } diff --git a/src/test/java/com/l2jserver/model/id/factory/IDFactoryTest.java b/src/test/java/com/l2jserver/model/id/factory/IDFactoryTest.java index e46331d62..1c0564555 100644 --- a/src/test/java/com/l2jserver/model/id/factory/IDFactoryTest.java +++ b/src/test/java/com/l2jserver/model/id/factory/IDFactoryTest.java @@ -23,7 +23,7 @@ import org.junit.Test; import com.google.inject.Guice; import com.google.inject.Injector; -import com.l2jserver.db.dao.MySQL5DAOModule; +import com.l2jserver.db.dao.H2DAOModule; import com.l2jserver.model.id.ID; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.model.id.object.provider.CharacterIDProvider; @@ -38,7 +38,7 @@ import com.l2jserver.service.game.world.WorldService; public class IDFactoryTest { private final Injector injector = Guice.createInjector(new ServiceModule(), - new MySQL5DAOModule(), new IDProviderModule()); + new H2DAOModule(), new IDProviderModule()); private CharacterIDProvider charIdFactory; @Before diff --git a/src/test/java/com/l2jserver/service/game/template/StaticTemplateServiceTest.java b/src/test/java/com/l2jserver/service/game/template/StaticTemplateServiceTest.java index 0b821737a..b9ff9dcb6 100644 --- a/src/test/java/com/l2jserver/service/game/template/StaticTemplateServiceTest.java +++ b/src/test/java/com/l2jserver/service/game/template/StaticTemplateServiceTest.java @@ -20,7 +20,7 @@ import org.junit.Test; import com.google.inject.Guice; import com.google.inject.Injector; -import com.l2jserver.db.dao.MySQL5DAOModule; +import com.l2jserver.db.dao.H2DAOModule; import com.l2jserver.model.id.provider.IDProviderModule; import com.l2jserver.model.id.template.provider.ItemTemplateIDProvider; import com.l2jserver.service.ServiceManager; @@ -29,7 +29,7 @@ import com.l2jserver.service.ServiceStartException; public class StaticTemplateServiceTest { private final Injector injector = Guice.createInjector(new ServiceModule(), - new IDProviderModule(), new MySQL5DAOModule()); + new IDProviderModule(), new H2DAOModule()); private final ItemTemplateIDProvider factory = injector .getInstance(ItemTemplateIDProvider.class); diff --git a/src/tool/java/com/l2jserver/model/template/CharacterTemplateConverter.java b/src/tool/java/com/l2jserver/model/template/CharacterTemplateConverter.java index e3cab387c..bb15e7d7a 100644 --- a/src/tool/java/com/l2jserver/model/template/CharacterTemplateConverter.java +++ b/src/tool/java/com/l2jserver/model/template/CharacterTemplateConverter.java @@ -33,7 +33,6 @@ import javax.xml.bind.SchemaOutputResolver; import javax.xml.transform.Result; import javax.xml.transform.stream.StreamResult; -import com.l2jserver.model.template.CharacterTemplate; import com.l2jserver.model.template.CharacterTemplate.CharacterStatsMetadata; import com.l2jserver.model.template.CharacterTemplate.CharacterStatsMetadata.AttackMetadata; import com.l2jserver.model.template.CharacterTemplate.CharacterStatsMetadata.AttackMetadata.AttackValueMetadata; @@ -44,7 +43,6 @@ import com.l2jserver.model.template.CharacterTemplate.CharacterStatsMetadata.Mov import com.l2jserver.model.template.CharacterTemplate.CharacterStatsMetadata.Stat; import com.l2jserver.model.template.CharacterTemplate.CollitionMetadataContainer; import com.l2jserver.model.template.CharacterTemplate.CollitionMetadataContainer.CollisionMetadata; -import com.l2jserver.model.world.character.CharacterClass; /** * The need to use this package to get access to protected fields. @@ -91,7 +89,7 @@ public class CharacterTemplateConverter { CharacterTemplate t = fillTemplate(rs); final File file = new File(target, "character/" - + camelCase(t.characterClass.name()) + ".xml"); + + camelCase(t.getCharacterClass().name()) + ".xml"); file.getParentFile().mkdirs(); m.marshal(t, file); @@ -111,8 +109,6 @@ public class CharacterTemplateConverter { throws SQLException { final CharacterTemplate t = new CharacterTemplate(); - t.characterClass = CharacterClass.fromID(rs.getInt("ClassId")); - // this.hpBase = ${defaulthpbase}; t.stats = new CharacterStatsMetadata(); t.stats.hp = new Stat(); t.stats.hp.base = rs.getDouble("defaulthpbase");