1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-05 23:22:47 +00:00

Implements a type-safe and java based new DAO model

This commit is contained in:
2011-12-22 17:18:12 -02:00
parent 84033a0bb9
commit 5b658a2eea
52 changed files with 2847 additions and 4695 deletions

View File

@@ -27,6 +27,16 @@
driver library must be available in the JVM classpath. -->
<driver>com.mysql.jdbc.Driver</driver>
<!-- The SQLTemplates provides several low-level SQL management. Templates
are database dependent. -->
<templates>com.mysema.query.sql.MySQLTemplates</templates>
<!-- The query factory provides an class that allows to convert Java
code to SQL code and parses database results into more easily managed Java
code. -->
<queryFactory>com.mysema.query.sql.mysql.MySQLQueryFactory
</queryFactory>
<!-- The username used to login into the database. NOTE: Try not use
"root" in production servers for security reasons. -->
<username>l2j</username>

View File

@@ -26,6 +26,16 @@
<!-- The driver used to connect to the database. Please note that the
driver library must be available in the JVM classpath. -->
<driver>com.mysql.jdbc.Driver</driver>
<!-- The SQLTemplates provides several low-level SQL management. Templates
are database dependent. -->
<templates>com.mysema.query.sql.MySQLTemplates</templates>
<!-- The query factory provides an class that allows to convert Java
code to SQL code and parses database results into more easily managed Java
code. -->
<queryFactory>com.mysema.query.sql.mysql.MySQLQueryFactory
</queryFactory>
<!-- The username used to login into the database. NOTE: Try not use
"root" in production servers for security reasons. -->

View File

@@ -21,7 +21,6 @@
<descriptors>
<descriptor>src/main/assembly/distribution-mysql5-bin.xml</descriptor>
<descriptor>src/main/assembly/distribution-h2-bin.xml</descriptor>
<descriptor>src/main/assembly/distribution-orientdb-bin.xml</descriptor>
<descriptor>src/main/assembly/distribution-derby-bin.xml</descriptor>
<descriptor>src/main/assembly/distribution-src.xml</descriptor>
</descriptors>
@@ -83,12 +82,6 @@
<version>10.8.2.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.orientechnologies</groupId>
<artifactId>orientdb-core</artifactId>
<version>1.0rc7</version>
<type>jar</type>
</dependency>
<!-- cache -->
<dependency>
<groupId>net.sf.ehcache</groupId>

View File

@@ -48,7 +48,6 @@
<excludes>
<exclude>mysql:*</exclude>
<exclude>com.h2database:*</exclude>
<exclude>com.orientechnologies:*</exclude>
</excludes>
</dependencySet>
</dependencySets>

View File

@@ -48,7 +48,6 @@
<excludes>
<exclude>mysql:*</exclude>
<exclude>org.apache.derby:*</exclude>
<exclude>com.orientechnologies:*</exclude>
</excludes>
</dependencySet>
</dependencySets>

View File

@@ -47,7 +47,6 @@
<excludes>
<exclude>com.h2database:*</exclude>
<exclude>org.apache.derby:*</exclude>
<exclude>com.orientechnologies:*</exclude>
</excludes>
</dependencySet>
</dependencySets>

View File

@@ -1,55 +0,0 @@
<assembly
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">
<id>orientdb-bin</id>
<formats>
<format>zip</format>
</formats>
<baseDirectory></baseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>data/**</include>
</includes>
<excludes>
<exclude>.gitignore</exclude>
<exclude>data/cache/**</exclude>
<exclude>data/pathing.db</exclude>
<exclude>data/database/derby/**</exclude>
<exclude>data/database/h2/**</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${project.basedir}/distribution/global</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.basedir}/distribution/sql</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<files>
<file>
<source>${project.build.directory}/${project.artifactId}-${project.version}.jar</source>
<outputDirectory>/</outputDirectory>
<destName>l2jserver2.jar</destName>
<fileMode>0755</fileMode>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/libs</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>false</unpack>
<scope>runtime</scope>
<excludes>
<exclude>mysql:*</exclude>
<exclude>com.h2database:*</exclude>
<exclude>org.apache.derby:*</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>

View File

@@ -16,50 +16,48 @@
*/
package com.l2jserver.service.database;
import java.sql.ResultSet;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.id.ID;
import com.l2jserver.model.game.CharacterShortcut.ShortcutType;
import com.l2jserver.model.template.actor.ActorSex;
import com.l2jserver.model.template.character.CharacterClass;
import com.l2jserver.model.template.character.CharacterRace;
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.CharacterInventory.InventoryPaperdoll;
import com.l2jserver.model.world.character.CharacterInventory.ItemLocation;
import com.l2jserver.service.AbstractService.Depends;
import com.l2jserver.service.cache.CacheService;
import com.l2jserver.service.configuration.ConfigurationService;
import com.l2jserver.service.core.LoggingService;
import com.l2jserver.service.core.threading.ThreadService;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService;
import com.l2jserver.service.game.chat.ChatMessageType;
import com.l2jserver.service.game.template.TemplateService;
import com.mysema.query.sql.types.EnumByNameType;
/**
* This is an implementation of {@link DatabaseService} that provides an layer
* to JDBC.
*
* <h1>Internal specification</h1> <h2>The
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.Query
* Query} object</h2>
*
* If you wish to implement a new {@link DataAccessObject} you should try not
* use {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* use
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.Query
* Query} object directly because it only provides low level access to the JDBC
* architecture. Instead, you could use an specialized class, like
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery
* InsertUpdateQuery} ,
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery
* SelectListQuery} or
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery
* SelectSingleQuery} . If you do need low level access, feel free to use the
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* {@link com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.Query
* Query} class directly.
*
* <h2>The
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper
* Mapper} object</h2>
*
* The {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper
* Mapper} object maps an JDBC {@link ResultSet} into an Java {@link Object}.
* All {@link Model} objects support
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper
* CachedMapper} that will cache result based on its {@link ID} and always use
* the same object with the same {@link ID}.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
@Depends({ LoggingService.class, CacheService.class,
@@ -80,6 +78,20 @@ public class GameServerJDBCDatabaseService extends AbstractJDBCDatabaseService
public GameServerJDBCDatabaseService(ConfigurationService configService,
CacheService cacheService, ThreadService threadService,
DAOResolver daoResolver) {
super(configService, cacheService, threadService, daoResolver);
super(
configService,
cacheService,
threadService,
daoResolver,
new EnumByNameType<CharacterRace>(CharacterRace.class),
new EnumByNameType<CharacterClass>(CharacterClass.class),
new EnumByNameType<ActorSex>(ActorSex.class),
new EnumByNameType<CharacterHairColor>(CharacterHairColor.class),
new EnumByNameType<CharacterHairStyle>(CharacterHairStyle.class),
new EnumByNameType<CharacterFace>(CharacterFace.class),
new EnumByNameType<ShortcutType>(ShortcutType.class),
new EnumByNameType<ItemLocation>(ItemLocation.class),
new EnumByNameType<InventoryPaperdoll>(InventoryPaperdoll.class),
new EnumByNameType<ChatMessageType>(ChatMessageType.class));
}
}

View File

@@ -1,85 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database;
import java.sql.ResultSet;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.id.ID;
import com.l2jserver.service.AbstractService.Depends;
import com.l2jserver.service.cache.CacheService;
import com.l2jserver.service.configuration.ConfigurationService;
import com.l2jserver.service.core.LoggingService;
import com.l2jserver.service.core.threading.ThreadService;
import com.l2jserver.service.game.template.TemplateService;
/**
* This is an implementation of {@link DatabaseService} that provides an layer
* to JDBC.
*
* <h1>Internal specification</h1> <h2>The
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* Query} object</h2>
*
* If you wish to implement a new {@link DataAccessObject} you should try not
* use {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* Query} object directly because it only provides low level access to the JDBC
* architecture. Instead, you could use an specialized class, like
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery
* InsertUpdateQuery} ,
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery
* SelectListQuery} or
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery
* SelectSingleQuery} . If you do need low level access, feel free to use the
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Query
* Query} class directly.
*
* <h2>The
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper
* Mapper} object</h2>
*
* The {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper
* Mapper} object maps an JDBC {@link ResultSet} into an Java {@link Object}.
* All {@link Model} objects support
* {@link com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper
* CachedMapper} that will cache result based on its {@link ID} and always use
* the same object with the same {@link ID}.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
@Depends({ LoggingService.class, CacheService.class,
ConfigurationService.class, TemplateService.class, ThreadService.class })
public class GameServerOrientDatabaseService extends
AbstractOrientDatabaseService implements DatabaseService {
/**
* @param configService
* the config service
* @param cacheService
* the cache service
* @param threadService
* the thread service
* @param daoResolver
* the {@link DataAccessObject DAO} resolver
*/
@Inject
public GameServerOrientDatabaseService(ConfigurationService configService,
CacheService cacheService, ThreadService threadService,
DAOResolver daoResolver) {
super(configService, cacheService, threadService, daoResolver);
}
}

View File

@@ -1,51 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.Scopes;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.service.database.orientdb.OrientDBCharacterDAO;
/**
* Google Guice {@link Module} for Orient Database DAOs
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class OrientDBDAOModule extends AbstractModule {
@Override
protected void configure() {
bind(CharacterDAO.class).to(OrientDBCharacterDAO.class).in(
Scopes.SINGLETON);
// bind(CharacterFriendDAO.class).to(OrientDBCharacterFriendDAO.class).in(
// Scopes.SINGLETON);
//
// bind(NPCDAO.class).to(OrientDBNPCDAO.class).in(Scopes.SINGLETON);
//
// bind(ItemDAO.class).to(OrientDBItemDAO.class).in(Scopes.SINGLETON);
// bind(ClanDAO.class).to(OrientDBClanDAO.class).in(Scopes.SINGLETON);
//
// // logs
// bind(ChatMessageDAO.class).to(OrientDBChatMessageDAO.class).in(
// Scopes.SINGLETON);
// DAO Resolver
bind(DAOResolver.class).to(GameServerDAOResolver.class).in(
Scopes.SINGLETON);
}
}

View File

@@ -16,10 +16,6 @@
*/
package com.l2jserver.service.database.jdbc;
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;
@@ -27,407 +23,178 @@ import com.l2jserver.model.Model;
import com.l2jserver.model.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.actor.ActorSex;
import com.l2jserver.model.template.character.CharacterClass;
import com.l2jserver.model.template.character.CharacterRace;
import com.l2jserver.model.template.character.CharacterTemplate;
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.service.database.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.util.geometry.Point3D;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.CharacterMapper;
import com.l2jserver.service.database.model.QCharacter;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link CharacterDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class JDBCCharacterDAO extends
AbstractJDBCDAO<L2Character, CharacterID> implements CharacterDAO {
public class JDBCCharacterDAO extends AbstractJDBCDAO<L2Character, CharacterID>
implements CharacterDAO {
/**
* The {@link CharacterID} factory
* The {@link L2Character} mapper
*/
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";
private final CharacterMapper mapper;
/**
* @param database
* the database service
* @param idFactory
* the character id provider
* @param templateIdFactory
* the template id provider
* @param accountIdFactory
* the account id provider
* @param clanIdFactory
* the clan id provider
* @param mapper
* the character mapper
*/
@Inject
public JDBCCharacterDAO(DatabaseService database,
final CharacterIDProvider idFactory,
CharacterTemplateIDProvider templateIdFactory,
AccountIDProvider accountIdFactory, ClanIDProvider clanIdFactory) {
public JDBCCharacterDAO(DatabaseService database, CharacterMapper mapper) {
super(database);
this.idFactory = idFactory;
this.templateIdFactory = templateIdFactory;
this.accountIdFactory = accountIdFactory;
this.clanIdFactory = clanIdFactory;
this.mapper = mapper;
}
/**
* The mapper for {@link CharacterID}
*/
private final Mapper<CharacterID> idMapper = new Mapper<CharacterID>() {
@Override
public CharacterID map(ResultSet rs) throws SQLException {
return idFactory.resolveID(rs.getInt(CHAR_ID));
}
};
/**
* The {@link Mapper} for {@link L2Character}
*/
private final Mapper<L2Character> mapper = new CachedMapper<L2Character, CharacterID>(
database, idMapper) {
@Override
protected L2Character map(CharacterID id, ResultSet rs)
throws SQLException {
final CharacterClass charClass = CharacterClass.valueOf(rs
.getString(CLASS));
final CharacterTemplateID templateId = templateIdFactory
.resolveID(charClass.id);
final CharacterTemplate template = templateId.getTemplate();
final L2Character character = template.create();
character.setID(id);
character.setAccountID(accountIdFactory.resolveID(rs
.getString(ACCOUNT_ID)));
if (rs.getString(CLAN_ID) != null)
character
.setClanID(clanIdFactory.resolveID(rs.getInt(CLAN_ID)));
character.setName(rs.getString(NAME));
character.setRace(CharacterRace.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(Point3D.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<L2Character>() {
return database.query(new SelectSingleQuery<L2Character, QCharacter>(
QCharacter.character, mapper) {
@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<L2Character> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QCharacter e) {
q.where(e.characterId.eq(id.getID()));
}
});
}
@Override
public void load(final Clan clan) {
clan.getMembers().load(
database.query(new SelectListQuery<CharacterID>() {
@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<CharacterID> mapper() {
return idMapper;
}
}));
clan.getMembers().load(database.query(new SelectListQuery<CharacterID, QCharacter>(
QCharacter.character, mapper.getIDMapper()) {
@Override
protected void query(AbstractSQLQuery<?> q, QCharacter e) {
q.where(e.clanId.eq(clan.getID().getID()));
}
}));
}
@Override
public L2Character selectByName(final String name) {
return database.query(new SelectSingleQuery<L2Character>() {
return database.query(new SelectSingleQuery<L2Character, QCharacter>(
QCharacter.character, mapper) {
@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<L2Character> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QCharacter e) {
q.where(e.name.eq(name));
}
});
}
@Override
public List<L2Character> selectByAccount(final AccountID account) {
return database.query(new SelectListQuery<L2Character>() {
return database.query(new SelectListQuery<L2Character, QCharacter>(
QCharacter.character, mapper) {
@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<L2Character> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QCharacter e) {
q.where(e.accountId.eq(account.getID()));
}
});
}
@Override
public List<CharacterID> selectIDs() {
return database.query(new SelectListQuery<CharacterID>() {
return database.query(new SelectListQuery<CharacterID, QCharacter>(
QCharacter.character, mapper.getIDMapper()) {
@Override
protected String query() {
return "SELECT `" + CHAR_ID + "` FROM `" + TABLE + "`";
}
@Override
protected Mapper<CharacterID> mapper() {
return idMapper;
protected void query(AbstractSQLQuery<?> q, QCharacter e) {
}
});
}
@Override
public int insertObjects(L2Character... characters) {
return database.query(new InsertUpdateQuery<L2Character>(characters) {
return database.query(new InsertQuery<L2Character, QCharacter, Object>(
QCharacter.character, characters) {
@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());
protected void map(SQLInsertClause q, L2Character o) {
q.set(e.characterId, o.getID().getID())
.set(e.accountId, o.getAccountID().getID())
.set(e.clanId,
(o.getClanID() != null ? o.getClanID().getID()
: null))
.set(e.name, o.getName())
.set(e.race, o.getRace())
.set(e.characterClass, o.getCharacterClass())
.set(e.sex, o.getSex())
.set(e.level, o.getLevel())
.set(e.experience, o.getExperience())
.set(e.sp, o.getSP())
.set(e.hp, o.getHP())
.set(e.mp, o.getMP())
.set(e.cp, o.getCP())
.set(e.pointX, o.getPoint().getX())
.set(e.pointY, o.getPoint().getY())
.set(e.pointZ, o.getPoint().getZ())
.set(e.pointAngle, o.getPoint().getAngle())
.set(e.appearanceHairStyle,
o.getAppearance().getHairStyle())
.set(e.appearanceHairColor,
o.getAppearance().getHairColor())
.set(e.apperanceFace, o.getAppearance().getFace());
}
});
}
@Override
public int updateObjects(L2Character... characters) {
return database.query(new InsertUpdateQuery<L2Character>(characters) {
return database.query(new UpdateQuery<L2Character, QCharacter>(
QCharacter.character, characters) {
@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 + "` = ?";
protected void query(SQLUpdateClause q, L2Character o) {
q.where(e.characterId.eq(o.getID().getID()));
}
@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());
protected void map(SQLUpdateClause q, L2Character o) {
q.set(e.accountId, o.getAccountID().getID())
.set(e.clanId,
(o.getClanID() != null ? o.getClanID().getID()
: null))
.set(e.name, o.getName())
.set(e.race, o.getRace())
.set(e.characterClass, o.getCharacterClass())
.set(e.sex, o.getSex())
.set(e.level, o.getLevel())
.set(e.experience, o.getExperience())
.set(e.sp, o.getSP())
.set(e.hp, o.getHP())
.set(e.mp, o.getMP())
.set(e.cp, o.getCP())
.set(e.pointX, o.getPoint().getX())
.set(e.pointY, o.getPoint().getY())
.set(e.pointZ, o.getPoint().getZ())
.set(e.pointAngle, o.getPoint().getAngle())
.set(e.appearanceHairStyle,
o.getAppearance().getHairStyle())
.set(e.appearanceHairColor,
o.getAppearance().getHairColor())
.set(e.apperanceFace, o.getAppearance().getFace());
}
});
}
@Override
public int deleteObjects(L2Character... characters) {
return database.query(new InsertUpdateQuery<L2Character>(characters) {
return database.query(new DeleteQuery<L2Character, QCharacter>(
QCharacter.character, characters) {
@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());
protected void query(SQLDeleteClause q, L2Character o) {
q.where(e.characterId.eq(o.getID().getID()));
}
});
}

View File

@@ -16,9 +16,6 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.google.inject.Inject;
@@ -26,17 +23,18 @@ import com.l2jserver.model.Model;
import com.l2jserver.model.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.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.mapper.CharacterFriendMapper;
import com.l2jserver.service.database.model.QCharacterFriend;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
/**
* {@link CharacterFriendDAO} implementation for JDBC
@@ -47,107 +45,47 @@ public class JDBCCharacterFriendDAO extends
AbstractJDBCDAO<CharacterFriend, FriendID> implements
CharacterFriendDAO {
/**
* The {@link FriendID} provider
* The {@link CharacterFriend} mapper
*/
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 = JDBCCharacterDAO.CHAR_ID;
public static final String CHAR_ID_FRIEND = JDBCCharacterDAO.CHAR_ID
+ "_friend";
private final CharacterFriendMapper mapper;
/**
* @param database
* the database service
* @param idProvider
* the frind id provider
* @param charIdProvider
* the character id provider
* @param mapper
* the character friend mapper
*/
@Inject
public JDBCCharacterFriendDAO(DatabaseService database,
final FriendIDProvider idProvider,
CharacterIDProvider charIdProvider) {
CharacterFriendMapper mapper) {
super(database);
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link FriendID}
*/
private final Mapper<FriendID> idMapper = new Mapper<FriendID>() {
@Override
public FriendID map(ResultSet rs) throws SQLException {
final CharacterID characterId = charIdProvider.resolveID(rs
.getInt(CHAR_ID));
final CharacterID friendId = charIdProvider.resolveID(rs
.getInt(CHAR_ID_FRIEND));
return idProvider.createID(characterId, friendId);
}
};
/**
* The {@link Mapper} for {@link CharacterFriend}
*/
private final Mapper<CharacterFriend> mapper = new CachedMapper<CharacterFriend, FriendID>(
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<CharacterFriend>() {
@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<CharacterFriend> mapper() {
return mapper;
}
});
return database
.query(new SelectSingleQuery<CharacterFriend, QCharacterFriend>(
QCharacterFriend.characterFriend, mapper) {
@Override
protected void query(AbstractSQLQuery<?> q,
QCharacterFriend e) {
q.where(e.characterId.eq(id.getCharacterID().getID())
.and(e.characterIdFriend.eq(id.getFriendID()
.getID())));
}
});
}
@Override
public void load(final L2Character character) {
final List<CharacterFriend> list = database
.query(new SelectListQuery<CharacterFriend>() {
.query(new SelectListQuery<CharacterFriend, QCharacterFriend>(
QCharacterFriend.characterFriend, mapper) {
@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<CharacterFriend> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q,
QCharacterFriend e) {
q.where(e.characterId.eq(character.getID().getID()));
}
});
character.getFriendList().load(list);
@@ -155,35 +93,25 @@ public class JDBCCharacterFriendDAO extends
@Override
public List<FriendID> selectIDs() {
return database.query(new SelectListQuery<FriendID>() {
return database.query(new SelectListQuery<FriendID, QCharacterFriend>(
QCharacterFriend.characterFriend, mapper.getIDMapper()) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "`";
}
@Override
protected Mapper<FriendID> mapper() {
return idMapper;
protected void query(AbstractSQLQuery<?> q, QCharacterFriend e) {
}
});
}
@Override
public int insertObjects(CharacterFriend... friends) {
return database.query(new InsertUpdateQuery<CharacterFriend>(friends) {
@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());
}
});
return database
.query(new InsertQuery<CharacterFriend, QCharacterFriend, Object>(
QCharacterFriend.characterFriend, friends) {
@Override
protected void map(SQLInsertClause q, CharacterFriend o) {
q.set(e.characterId, o.getCharacterID().getID()).set(
e.characterIdFriend, o.getFriendID().getID());
}
});
}
@Override
@@ -195,20 +123,17 @@ public class JDBCCharacterFriendDAO extends
@Override
public int deleteObjects(CharacterFriend... friends) {
return database.query(new InsertUpdateQuery<CharacterFriend>(friends) {
@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());
}
});
return database
.query(new DeleteQuery<CharacterFriend, QCharacterFriend>(
QCharacterFriend.characterFriend, friends) {
@Override
protected void query(SQLDeleteClause q, CharacterFriend o) {
q.where(e.characterId.eq(
o.getID().getCharacterID().getID()).and(
e.characterIdFriend.eq(o.getID().getFriendID()
.getID())));
}
});
}
@Override
@@ -228,7 +153,7 @@ public class JDBCCharacterFriendDAO extends
}
return true;
}
@Override
protected CharacterFriend[] wrap(Model<?>... objects) {
final CharacterFriend[] array = new CharacterFriend[objects.length];

View File

@@ -16,32 +16,27 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterFriendDAO;
import com.l2jserver.model.dao.CharacterShortcutDAO;
import com.l2jserver.model.game.CharacterFriend;
import com.l2jserver.model.game.CharacterShortcut;
import com.l2jserver.model.game.CharacterShortcut.ShortcutType;
import com.l2jserver.model.id.CharacterShortcutID;
import com.l2jserver.model.id.FriendID;
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.provider.CharacterShortcutIDProvider;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.CharacterShortcutMapper;
import com.l2jserver.service.database.model.QCharacterShortcut;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link CharacterFriendDAO} implementation for JDBC
@@ -51,239 +46,114 @@ import com.l2jserver.service.database.DatabaseService;
public class JDBCCharacterShortcutDAO extends
AbstractJDBCDAO<CharacterShortcut, CharacterShortcutID> implements
CharacterShortcutDAO {
/**
* The {@link CharacterShortcutID} provider
*/
private final CharacterShortcutIDProvider idProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* The {@link ItemID} provider
*/
private final ItemIDProvider itemIdProvider;
/**
* Character table name
*/
public static final String TABLE = "character_shortcut";
// FIELDS
public static final String SHORTCUT_ID = "shortcut_id";
public static final String CHAR_ID = JDBCCharacterDAO.CHAR_ID;
public static final String TYPE = "type";
public static final String SLOT = "slot";
public static final String PAGE = "page";
// item id, skill id (pretty much anything!)
public static final String OBJECT_ID = "object_id";
public static final String SKILL_LEVEL = "skill_level";
private final CharacterShortcutMapper mapper;
/**
* @param database
* the database service
* @param idProvider
* the frind id provider
* @param charIdProvider
* the character id provider
* @param itemIdProvider
* the item id provider
* @param mapper
* the {@link CharacterShortcut} mapper
*/
@Inject
public JDBCCharacterShortcutDAO(DatabaseService database,
final CharacterShortcutIDProvider idProvider,
CharacterIDProvider charIdProvider, ItemIDProvider itemIdProvider) {
CharacterShortcutMapper mapper) {
super(database);
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
this.itemIdProvider = itemIdProvider;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link FriendID}
*/
private final Mapper<CharacterShortcutID> idMapper = new Mapper<CharacterShortcutID>() {
@Override
public CharacterShortcutID map(ResultSet rs) throws SQLException {
return idProvider.resolveID(rs.getInt(SHORTCUT_ID));
}
};
/**
* The {@link Mapper} for {@link CharacterFriend}
*/
private final Mapper<CharacterShortcut> mapper = new CachedMapper<CharacterShortcut, CharacterShortcutID>(
database, idMapper) {
@Override
protected CharacterShortcut map(CharacterShortcutID id, ResultSet rs)
throws SQLException {
final CharacterShortcut shortcut = new CharacterShortcut();
shortcut.setID(id);
final CharacterID charId = charIdProvider.resolveID(rs
.getInt(CHAR_ID));
shortcut.setCharacterID(charId);
// resolve type
final ShortcutType type = ShortcutType.valueOf(rs.getString(TYPE));
shortcut.setType(type);
switch (type) {
case ITEM:
final ItemID itemId = itemIdProvider.resolveID(rs
.getInt(OBJECT_ID));
shortcut.setItemID(itemId);
break;
}
shortcut.setPage(rs.getInt(PAGE));
shortcut.setSlot(rs.getInt(SLOT));
return shortcut;
}
};
@Override
public CharacterShortcut select(final CharacterShortcutID id) {
return database.query(new SelectSingleQuery<CharacterShortcut>() {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "` WHERE `" + SHORTCUT_ID
+ "` = ?";
}
@Override
protected void parametize(PreparedStatement st) throws SQLException {
st.setInt(1, id.getID());
}
@Override
protected Mapper<CharacterShortcut> mapper() {
return mapper;
}
});
return database
.query(new SelectSingleQuery<CharacterShortcut, QCharacterShortcut>(
QCharacterShortcut.characterShortcut, mapper) {
@Override
protected void query(AbstractSQLQuery<?> q,
QCharacterShortcut e) {
q.where(e.shortcutId.eq(id.getID()));
}
});
}
@Override
public List<CharacterShortcut> selectByCharacter(final L2Character character) {
return database.query(new SelectListQuery<CharacterShortcut>() {
@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<CharacterShortcut> mapper() {
return mapper;
}
});
return database
.query(new SelectListQuery<CharacterShortcut, QCharacterShortcut>(
QCharacterShortcut.characterShortcut, mapper) {
@Override
protected void query(AbstractSQLQuery<?> q,
QCharacterShortcut e) {
q.where(e.characterId.eq(character.getID().getID()));
}
});
}
@Override
public List<CharacterShortcutID> selectIDs() {
return database.query(new SelectListQuery<CharacterShortcutID>() {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "`";
}
@Override
protected Mapper<CharacterShortcutID> mapper() {
return idMapper;
}
});
return database
.query(new SelectListQuery<CharacterShortcutID, QCharacterShortcut>(
QCharacterShortcut.characterShortcut, mapper
.getIDMapper()) {
@Override
protected void query(AbstractSQLQuery<?> q,
QCharacterShortcut e) {
}
});
}
@Override
public int insertObjects(CharacterShortcut... shortcuts) {
return database.query(new InsertUpdateQuery<CharacterShortcut>(
shortcuts) {
@Override
protected String query() {
return "INSERT INTO `" + TABLE + "` (`" + CHAR_ID + "`,`"
+ TYPE + "`, `" + OBJECT_ID + "`, `" + SLOT + "`, `"
+ PAGE + "`) VALUES(?,?,?,?,?)";
}
@Override
protected void parametize(PreparedStatement st,
CharacterShortcut shortcut) throws SQLException {
int i = 1;
st.setInt(i++, shortcut.getCharacterID().getID());
st.setString(i++, shortcut.getType().name());
switch (shortcut.getType()) {
case ITEM:
st.setInt(i++, shortcut.getItemID().getID());
break;
}
st.setInt(i++, shortcut.getSlot());
st.setInt(i++, shortcut.getPage());
}
@Override
protected Mapper<CharacterShortcutID> keyMapper() {
return new Mapper<CharacterShortcutID>() {
return database
.query(new InsertQuery<CharacterShortcut, QCharacterShortcut, Integer>(
QCharacterShortcut.characterShortcut,
QCharacterShortcut.characterShortcut.shortcutId,
shortcuts) {
@Override
public CharacterShortcutID map(ResultSet rs)
throws SQLException {
return idProvider.resolveID(rs.getInt(1));
};
};
}
});
protected void map(SQLInsertClause q, CharacterShortcut o) {
q.set(e.characterId, o.getID().getID())
.set(e.type, o.getType())
.set(e.objectId, o.getItemID().getID())
.set(e.slot, o.getSlot())
.set(e.page, o.getPage());
}
@Override
protected void key(Integer k, CharacterShortcut o) {
// TODO
}
});
}
@Override
public int updateObjects(CharacterShortcut... shortcuts) {
return database.query(new InsertUpdateQuery<CharacterShortcut>(
shortcuts) {
@Override
protected String query() {
return "UPDATE `" + TABLE + "` SET `" + CHAR_ID + "` = ?,`"
+ TYPE + "` = ?, `" + OBJECT_ID + "` = ?, `" + SLOT
+ "` = ?, `" + PAGE + "` = ? WHERE `" + SHORTCUT_ID
+ "` = ?";
}
return database
.query(new UpdateQuery<CharacterShortcut, QCharacterShortcut>(
QCharacterShortcut.characterShortcut, shortcuts) {
@Override
protected void query(SQLUpdateClause q, CharacterShortcut o) {
q.where(e.shortcutId.eq(o.getID().getID()));
}
@Override
protected void parametize(PreparedStatement st,
CharacterShortcut shortcut) throws SQLException {
int i = 1;
st.setInt(i++, shortcut.getCharacterID().getID());
st.setString(i++, shortcut.getType().name());
switch (shortcut.getType()) {
case ITEM:
st.setInt(i++, shortcut.getItemID().getID());
break;
}
st.setInt(i++, shortcut.getSlot());
st.setInt(i++, shortcut.getPage());
st.setInt(i++, shortcut.getID().getID());
}
});
@Override
protected void map(SQLUpdateClause q, CharacterShortcut o) {
q.set(e.characterId, o.getID().getID())
.set(e.type, o.getType())
.set(e.objectId, o.getItemID().getID())
.set(e.slot, o.getSlot())
.set(e.page, o.getPage());
}
});
}
@Override
public int deleteObjects(CharacterShortcut... shortcuts) {
return database.query(new InsertUpdateQuery<CharacterShortcut>(
shortcuts) {
@Override
protected String query() {
return "DELETE FROM `" + TABLE + "` WHERE `" + SHORTCUT_ID
+ "` = ?";
}
@Override
protected void parametize(PreparedStatement st,
CharacterShortcut shortcut) throws SQLException {
st.setInt(1, shortcut.getID().getID());
}
});
return database
.query(new DeleteQuery<CharacterShortcut, QCharacterShortcut>(
QCharacterShortcut.characterShortcut, shortcuts) {
@Override
protected void query(SQLDeleteClause q, CharacterShortcut o) {
q.where(e.shortcutId.eq(o.getID().getID()));
}
});
}
@Override

View File

@@ -16,29 +16,26 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Collection;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.model.dao.ChatMessageDAO;
import com.l2jserver.model.id.ChatMessageID;
import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.provider.CharacterIDProvider;
import com.l2jserver.model.id.provider.ChatMessageIDProvider;
import com.l2jserver.model.server.ChatMessage;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.game.chat.ChatMessageType;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.ChatMessageMapper;
import com.l2jserver.service.database.model.QLogChat;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link CharacterDAO} implementation for JDBC
@@ -47,186 +44,99 @@ import com.l2jserver.service.game.chat.ChatMessageType;
*/
public class JDBCChatMessageDAO extends
AbstractJDBCDAO<ChatMessage, ChatMessageID> implements ChatMessageDAO {
/**
* The {@link ChatMessageID} factory
*/
private final ChatMessageIDProvider idFactory;
/**
* The {@link CharacterID} factory
*/
private final CharacterIDProvider charIdFactory;
/**
* Character table name
*/
public static final String TABLE = "log_chat";
// FIELDS
public static final String MESSAGE_ID = "message_id";
public static final String TYPE = "type";
public static final String CHANNEL_ID = "channel_id";
public static final String SENDER = "sender";
public static final String DATE = "date";
public static final String MESSAGE = "message";
private final ChatMessageMapper mapper;
/**
* @param database
* the database service
* @param idFactory
* the chat message id provider
* @param charIdFactory
* the character id provider
* @param mapper
* the mapper
*/
@Inject
public JDBCChatMessageDAO(DatabaseService database,
ChatMessageIDProvider idFactory,
final CharacterIDProvider charIdFactory) {
public JDBCChatMessageDAO(DatabaseService database, ChatMessageMapper mapper) {
super(database);
this.idFactory = idFactory;
this.charIdFactory = charIdFactory;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link ChatMessageID}
*/
private final Mapper<ChatMessageID> idMapper = new Mapper<ChatMessageID>() {
@Override
public ChatMessageID map(ResultSet rs) throws SQLException {
return idFactory.resolveID(rs.getInt(MESSAGE_ID));
}
};
/**
* The {@link Mapper} for {@link ChatMessageID} as a PRIMARY KEY
*/
private final Mapper<ChatMessageID> primaryKeyMapper = new Mapper<ChatMessageID>() {
@Override
public ChatMessageID map(ResultSet rs) throws SQLException {
return idFactory.resolveID(rs.getInt(1));
}
};
/**
* The {@link Mapper} for {@link ChatMessage}
*/
private final Mapper<ChatMessage> mapper = new CachedMapper<ChatMessage, ChatMessageID>(
database, idMapper) {
@Override
protected ChatMessage map(ChatMessageID id, ResultSet rs)
throws SQLException {
final ChatMessage message = new ChatMessage();
message.setID(id);
message.setType(ChatMessageType.valueOf(rs.getString(TYPE)));
switch (message.getType()) {
case SHOUT:
message.setTarget(charIdFactory.resolveID(rs.getInt(CHANNEL_ID)));
break;
default:
message.setChannelID(rs.getInt(CHANNEL_ID));
break;
}
message.setSender(charIdFactory.resolveID(rs.getInt(SENDER)));
message.setDate(new Date(rs.getTimestamp(DATE).getTime()));
message.setMessage(rs.getString(MESSAGE));
return message;
}
};
@Override
public ChatMessage select(final ChatMessageID id) {
return database.query(new SelectSingleQuery<ChatMessage>() {
return database.query(new SelectSingleQuery<ChatMessage, QLogChat>(
QLogChat.logChat, mapper) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "` WHERE `" + MESSAGE_ID
+ "` = ?";
}
@Override
protected void parametize(PreparedStatement st) throws SQLException {
st.setInt(1, id.getID());
}
@Override
protected Mapper<ChatMessage> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QLogChat e) {
q.where(e.messageId.eq(id.getID()));
}
});
}
@Override
public List<ChatMessageID> selectIDs() {
return database.query(new SelectListQuery<ChatMessageID>() {
public Collection<ChatMessageID> selectIDs() {
return database.query(new SelectListQuery<ChatMessageID, QLogChat>(
QLogChat.logChat, mapper.getIDMapper()) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "`";
}
@Override
protected Mapper<ChatMessageID> mapper() {
return idMapper;
protected void query(AbstractSQLQuery<?> q, QLogChat e) {
}
});
}
@Override
public int insertObjects(ChatMessage... messages) {
return database.query(new InsertUpdateQuery<ChatMessage>(messages) {
public int insertObjects(ChatMessage... objects) {
return database.query(new InsertQuery<ChatMessage, QLogChat, Integer>(
QLogChat.logChat, QLogChat.logChat.messageId, objects) {
@Override
protected String query() {
return "INSERT INTO `" + TABLE + "` (`" + TYPE + "`,`"
+ CHANNEL_ID + "`,`" + SENDER + "`,`" + DATE + "`,`"
+ MESSAGE + "`) VALUES(?,?,?,?,?)";
}
@Override
protected void parametize(PreparedStatement st, ChatMessage message)
throws SQLException {
int i = 1;
st.setString(i++, message.getType().name());
switch (message.getType()) {
protected void map(SQLInsertClause q, ChatMessage o) {
q.set(e.type, o.getType()).set(e.sender, o.getSender().getID())
.set(e.date, o.getDate())
.set(e.message, o.getMessage());
switch (o.getType()) {
case SHOUT:
st.setInt(i++, message.getTarget().getID());
q.set(e.channelId, o.getTarget().getID());
break;
default:
st.setInt(i++, message.getChannelID());
q.set(e.channelId, o.getChannelID());
break;
}
st.setInt(i++, message.getSender().getID());
st.setTimestamp(i++, new Timestamp(message.getDate().getTime()));
st.setString(i++, message.getMessage());
}
@Override
protected Mapper<ChatMessageID> keyMapper() {
return primaryKeyMapper;
}
});
}
@Override
public int updateObjects(ChatMessage... messages) {
// cannot update chat message logs
return 0;
}
@Override
public int deleteObjects(ChatMessage... messages) {
return database.query(new InsertUpdateQuery<ChatMessage>(messages) {
public int updateObjects(ChatMessage... objects) {
return database.query(new UpdateQuery<ChatMessage, QLogChat>(
QLogChat.logChat, objects) {
@Override
protected String query() {
return "DELETE FROM `" + TABLE + "` WHERE `" + MESSAGE_ID
+ "` = ?";
protected void query(SQLUpdateClause q, ChatMessage o) {
q.where(e.messageId.eq(o.getID().getID()));
}
@Override
protected void parametize(PreparedStatement st, ChatMessage message)
throws SQLException {
st.setInt(1, message.getID().getID());
protected void map(SQLUpdateClause q, ChatMessage o) {
q.set(e.type, o.getType()).set(e.sender, o.getSender().getID())
.set(e.date, o.getDate())
.set(e.message, o.getMessage());
switch (o.getType()) {
case SHOUT:
q.set(e.channelId, o.getTarget().getID());
break;
default:
q.set(e.channelId, o.getChannelID());
break;
}
}
});
}
@Override
public int deleteObjects(ChatMessage... objects) {
return database.query(new DeleteQuery<ChatMessage, QLogChat>(
QLogChat.logChat, objects) {
@Override
protected void query(SQLDeleteClause q, ChatMessage o) {
q.where(e.messageId.eq(o.getID().getID()));
}
});
}
@Override
protected ChatMessage[] wrap(Model<?>... objects) {
final ChatMessage[] array = new ChatMessage[objects.length];

View File

@@ -16,167 +16,109 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Collection;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.model.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.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.ClanMapper;
import com.l2jserver.service.database.model.QClan;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link CharacterDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class JDBCClanDAO extends AbstractJDBCDAO<Clan, ClanID>
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";
public class JDBCClanDAO extends AbstractJDBCDAO<Clan, ClanID> implements
ClanDAO {
private final ClanMapper mapper;
/**
* @param database
* the database service
* @param clanIdFactory
* the clan id provider
* @param idFactory
* the character id provider
* @param mapper
* the mapper
*/
@Inject
public JDBCClanDAO(DatabaseService database, ClanIDProvider clanIdFactory,
final CharacterIDProvider idFactory) {
public JDBCClanDAO(DatabaseService database, final ClanMapper mapper) {
super(database);
this.idFactory = clanIdFactory;
this.charIdFactory = idFactory;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link ClanID}
*/
private final Mapper<ClanID> idMapper = new Mapper<ClanID>() {
@Override
public ClanID map(ResultSet rs) throws SQLException {
return idFactory.resolveID(rs.getInt(CLAN_ID));
}
};
/**
* The {@link Mapper} for {@link Clan}
*/
private final Mapper<Clan> mapper = new CachedMapper<Clan, ClanID>(
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<Clan>() {
return database.query(new SelectSingleQuery<Clan, QClan>(QClan.clan,
mapper) {
@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<Clan> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QClan e) {
q.where(e.clanId.eq(id.getID()));
}
});
}
@Override
public List<ClanID> selectIDs() {
return database.query(new SelectListQuery<ClanID>() {
public Collection<ClanID> selectIDs() {
return database.query(new SelectListQuery<ClanID, QClan>(QClan.clan,
mapper.getIDMapper()) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "`";
}
@Override
protected Mapper<ClanID> mapper() {
return idMapper;
protected void query(AbstractSQLQuery<?> q, QClan e) {
}
});
}
@Override
public int insertObjects(Clan... clans) {
return database.query(new InsertUpdateQuery<Clan>(clans) {
public int insertObjects(Clan... objects) {
return database.query(new InsertQuery<Clan, QClan, Integer>(QClan.clan,
QClan.clan.clanId, objects) {
@Override
protected String query() {
return "INSERT INTO `" + TABLE + "` (`" + CLAN_ID
+ "`) VALUES(?)";
}
@Override
protected void parametize(PreparedStatement st, Clan clan)
throws SQLException {
st.setInt(1, clan.getID().getID());
protected void map(SQLInsertClause q, Clan o) {
q.set(e.clanId, o.getID().getID()).set(e.characterIdLeader,
o.getLeaderID().getID());
}
});
}
@Override
public int updateObjects(Clan... clans) {
// TODO implement clan update
return 0;
public int updateObjects(Clan... objects) {
return database
.query(new UpdateQuery<Clan, QClan>(QClan.clan, objects) {
@Override
protected void query(SQLUpdateClause q, Clan o) {
q.where(e.clanId.eq(o.getID().getID()));
}
@Override
protected void map(SQLUpdateClause q, Clan o) {
q.set(e.clanId, o.getID().getID()).set(
e.characterIdLeader, o.getLeaderID().getID());
}
});
}
@Override
public int deleteObjects(Clan... clans) {
return database.query(new InsertUpdateQuery<Clan>(clans) {
@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());
}
});
public int deleteObjects(Clan... objects) {
return database
.query(new DeleteQuery<Clan, QClan>(QClan.clan, objects) {
@Override
protected void query(SQLDeleteClause q, Clan o) {
q.where(e.clanId.eq(o.getID().getID()));
}
});
}
@Override
protected Clan[] wrap(Model<?>... objects) {
final Clan[] array = new Clan[objects.length];

View File

@@ -16,331 +16,162 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.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.item.ItemTemplate;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
import com.l2jserver.model.world.character.CharacterInventory.ItemLocation;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.util.geometry.Coordinate;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.ItemMapper;
import com.l2jserver.service.database.model.QItem;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link ItemDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class JDBCItemDAO extends AbstractJDBCDAO<Item, ItemID>
implements ItemDAO {
/**
* The logger
*/
private final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 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 = JDBCCharacterDAO.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";
public class JDBCItemDAO extends AbstractJDBCDAO<Item, ItemID> implements
ItemDAO {
private final ItemMapper mapper;
/**
* @param database
* the database service
* @param idFactory
* the item id provider
* @param templateIdFactory
* the item template id provider
* @param charIdFactory
* the character id provider
* @param mapper
* the mapper
*/
@Inject
public JDBCItemDAO(DatabaseService database,
final ItemIDProvider idFactory,
ItemTemplateIDProvider templateIdFactory,
CharacterIDProvider charIdFactory) {
public JDBCItemDAO(DatabaseService database, ItemMapper mapper) {
super(database);
this.idFactory = idFactory;
this.templateIdFactory = templateIdFactory;
this.charIdFactory = charIdFactory;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link ItemID}
*/
private final Mapper<ItemID> idMapper = new Mapper<ItemID>() {
@Override
public ItemID map(ResultSet rs) throws SQLException {
return idFactory.resolveID(rs.getInt(ITEM_ID));
}
};
/**
* The {@link Mapper} instance
*/
private final Mapper<Item> mapper = new CachedMapper<Item, ItemID>(
database, idMapper) {
@Override
public Item map(ItemID id, ResultSet rs) throws SQLException {
final ItemTemplateID templateId = templateIdFactory.resolveID(rs
.getInt(TEMPLATE_ID));
final ItemTemplate template = templateId.getTemplate();
if (template == null) {
log.warn("No template found for {} while loading {}",
templateId, id);
return null;
}
final Item item = template.create();
item.setID(id);
if (rs.getObject(CHAR_ID) != null)
item.setOwnerID(charIdFactory.resolveID(rs.getInt(CHAR_ID)));
if (rs.getObject(LOCATION) != null)
item.setLocation(ItemLocation.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<Item>() {
return database.query(new SelectSingleQuery<Item, QItem>(QItem.item,
mapper) {
@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<Item> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QItem e) {
q.where(e.itemId.eq(id.getID()));
}
});
}
@Override
public List<Item> selectByCharacter(final L2Character character) {
return database.query(new SelectListQuery<Item>() {
return database.query(new SelectListQuery<Item, QItem>(QItem.item,
mapper) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "` WHERE `" + CHAR_ID
+ "` = ? AND `location` = ?";
}
@Override
protected void parametize(PreparedStatement st) throws SQLException {
st.setInt(1, character.getID().getID());
st.setString(2, ItemLocation.INVENTORY.name());
}
@Override
protected Mapper<Item> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QItem e) {
q.where(e.characterId.eq(character.getID().getID()));
}
});
}
@Override
public List<Item> selectDroppedItems() {
return database.query(new SelectListQuery<Item>() {
return database.query(new SelectListQuery<Item, QItem>(QItem.item,
mapper) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "` WHERE `" + LOCATION
+ "` = ?";
}
@Override
protected void parametize(PreparedStatement st) throws SQLException {
st.setString(1, ItemLocation.GROUND.name());
}
@Override
protected Mapper<Item> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QItem e) {
q.where(e.location.eq(ItemLocation.GROUND));
}
});
}
@Override
public List<ItemID> selectIDs() {
return database.query(new SelectListQuery<ItemID>() {
public Collection<ItemID> selectIDs() {
return database.query(new SelectListQuery<ItemID, QItem>(QItem.item,
mapper.getIDMapper()) {
@Override
protected String query() {
return "SELECT `" + ITEM_ID + "` FROM `" + TABLE + "`";
}
@Override
protected Mapper<ItemID> mapper() {
return idMapper;
protected void query(AbstractSQLQuery<?> q, QItem e) {
}
});
}
@Override
public int insertObjects(Item... items) {
return database.query(new InsertUpdateQuery<Item>(items) {
public int insertObjects(Item... objects) {
return database.query(new InsertQuery<Item, QItem, Object>(QItem.item,
objects) {
@Override
protected String query() {
return "INSERT INTO `" + TABLE + "` (`" + ITEM_ID + "`,`"
+ TEMPLATE_ID + "`,`" + CHAR_ID + "`,`" + LOCATION
+ "`,`" + PAPERDOLL + "`,`" + COUNT + "`,`" + COORD_X
+ "`,`" + COORD_Y + "`,`" + COORD_Z
+ "`) VALUES(?,?,?,?,?,?,?,?,?)";
}
@Override
protected void parametize(PreparedStatement st, Item item)
throws SQLException {
int i = 1;
st.setInt(i++, item.getID().getID());
st.setInt(i++, item.getTemplateID().getID());
if (item.getOwnerID() != null) {
st.setInt(i++, item.getOwnerID().getID());
} else {
st.setNull(i++, Types.INTEGER);
}
st.setString(i++, item.getLocation().name());
st.setString(i++, (item.getPaperdoll() != null ? item
.getPaperdoll().name() : null));
st.setLong(i++, item.getCount());
if (item.getPoint() != null) {
st.setInt(i++, item.getPoint().getX());
st.setInt(i++, item.getPoint().getY());
st.setInt(i++, item.getPoint().getZ());
} else {
st.setNull(i++, Types.INTEGER);
st.setNull(i++, Types.INTEGER);
st.setNull(i++, Types.INTEGER);
}
protected void map(SQLInsertClause q, Item o) {
q.set(e.itemId, o.getID().getID())
.set(e.templateId, o.getTemplateID().getID())
.set(e.characterId,
(o.getOwnerID() != null ? o.getOwnerID()
.getID() : null))
.set(e.location, o.getLocation())
.set(e.paperdoll, o.getPaperdoll())
.set(e.count, o.getCount())
.set(e.coordX,
(o.getPoint() != null ? o.getPoint().getX()
: null))
.set(e.coordY,
(o.getPoint() != null ? o.getPoint().getY()
: null))
.set(e.coordZ,
(o.getPoint() != null ? o.getPoint().getZ()
: null));
}
});
}
@Override
public int updateObjects(Item... items) {
return database.query(new InsertUpdateQuery<Item>(items) {
@Override
protected String query() {
return "UPDATE `" + TABLE + "` SET `" + CHAR_ID + "` = ?,`"
+ LOCATION + "` = ?,`" + PAPERDOLL + "` = ?,`" + COUNT
+ "` = ?,`" + COORD_X + "` = ?,`" + COORD_Y + "` = ?,`"
+ COORD_Z + "` = ? WHERE `" + ITEM_ID + "` = ?";
}
public int updateObjects(Item... objects) {
return database
.query(new UpdateQuery<Item, QItem>(QItem.item, objects) {
@Override
protected void query(SQLUpdateClause q, Item o) {
q.where(e.itemId.eq(o.getID().getID()));
}
@Override
protected void parametize(PreparedStatement st, Item item)
throws SQLException {
int i = 1;
// SET
if (item.getOwnerID() != null) {
st.setInt(i++, item.getOwnerID().getID());
} else {
st.setNull(i++, Types.INTEGER);
}
st.setString(i++, item.getLocation().name());
st.setString(i++, (item.getPaperdoll() != null ? item
.getPaperdoll().name() : null));
st.setLong(i++, item.getCount());
if (item.getPoint() != null) {
st.setInt(i++, item.getPoint().getX());
st.setInt(i++, item.getPoint().getY());
st.setInt(i++, item.getPoint().getZ());
} else {
st.setNull(i++, Types.INTEGER);
st.setNull(i++, Types.INTEGER);
st.setNull(i++, Types.INTEGER);
}
// WHERE
st.setInt(i++, item.getID().getID());
}
});
@Override
protected void map(SQLUpdateClause q, Item o) {
q.set(e.templateId, o.getTemplateID().getID())
.set(e.characterId,
(o.getOwnerID() != null ? o
.getOwnerID().getID() : null))
.set(e.location, o.getLocation())
.set(e.paperdoll, o.getPaperdoll())
.set(e.count, o.getCount())
.set(e.coordX,
(o.getPoint() != null ? o.getPoint()
.getX() : null))
.set(e.coordY,
(o.getPoint() != null ? o.getPoint()
.getY() : null))
.set(e.coordZ,
(o.getPoint() != null ? o.getPoint()
.getZ() : null));
}
});
}
@Override
public int deleteObjects(Item... items) {
return database.query(new DeleteQuery<Item>(database, items) {
@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());
}
@Override
protected void dispose(Item object) {
idFactory.destroy(object.getID());
}
});
public int deleteObjects(Item... objects) {
return database
.query(new DeleteQuery<Item, QItem>(QItem.item, objects) {
@Override
protected void query(SQLDeleteClause q, Item o) {
q.where(e.itemId.eq(o.getID().getID()));
}
});
}
@Override
protected Item[] wrap(Model<?>... objects) {
final Item[] array = new Item[objects.length];

View File

@@ -16,285 +16,157 @@
*/
package com.l2jserver.service.database.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.model.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.npc.NPCTemplate;
import com.l2jserver.model.world.NPC;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.util.geometry.Point3D;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.DeleteQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.InsertQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectListQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.jdbc.AbstractJDBCDatabaseService.UpdateQuery;
import com.l2jserver.service.database.mapper.NPCMapper;
import com.l2jserver.service.database.model.QNPC;
import com.mysema.query.sql.AbstractSQLQuery;
import com.mysema.query.sql.dml.SQLDeleteClause;
import com.mysema.query.sql.dml.SQLInsertClause;
import com.mysema.query.sql.dml.SQLUpdateClause;
/**
* {@link CharacterDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class JDBCNPCDAO extends AbstractJDBCDAO<NPC, NPCID> implements
NPCDAO {
/**
* The logger
*/
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 HP = "hp";
public static final String MP = "mp";
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 RESPAWN_TIME = "respawn_time";
public class JDBCNPCDAO extends AbstractJDBCDAO<NPC, NPCID> implements NPCDAO {
private final NPCMapper mapper;
/**
* @param database
* the database service
* @param idProvider
* the npc id provider
* @param templateIdProvider
* the npc template id provider
* @param mapper
* the mapper
*/
@Inject
public JDBCNPCDAO(DatabaseService database, final NPCIDProvider idProvider,
NPCTemplateIDProvider templateIdProvider) {
public JDBCNPCDAO(DatabaseService database, NPCMapper mapper) {
super(database);
this.idProvider = idProvider;
this.templateIdProvider = templateIdProvider;
this.mapper = mapper;
}
/**
* The {@link Mapper} for {@link NPCID}
*/
private final Mapper<NPCID> idMapper = new Mapper<NPCID>() {
@Override
public NPCID map(ResultSet rs) throws SQLException {
if (rs.getString(NPC_ID) == null)
return null;
return idProvider.resolveID(rs.getInt(NPC_ID));
}
};
/**
* The {@link Mapper} for {@link NPC}
*/
private final Mapper<NPC> mapper = new CachedMapper<NPC, NPCID>(database,
idMapper) {
@Override
protected NPC map(NPCID id, ResultSet rs) throws SQLException {
NPCTemplateID templateId = templateIdProvider.resolveID(rs
.getInt(NPC_TEMPLATE_ID));
NPCTemplate template = templateId.getTemplate();
if (template == null) {
log.warn("No template found for {}", templateId);
return null;
}
final NPC npc = template.create();
npc.setID(id);
if (rs.getString(HP) != null)
npc.setHP(rs.getDouble(HP));
if (rs.getString(MP) != null)
npc.setMP(rs.getDouble(MP));
npc.setPoint(Point3D.fromXYZA(rs.getInt(POINT_X),
rs.getInt(POINT_Y), rs.getInt(POINT_Z),
rs.getDouble(POINT_ANGLE)));
npc.setRespawnInterval(rs.getLong(RESPAWN_TIME));
return npc;
}
};
@Override
public NPC select(final NPCID id) {
return database.query(new SelectSingleQuery<NPC>() {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "` WHERE `" + NPC_ID
+ "` = ?";
}
return database
.query(new SelectSingleQuery<NPC, QNPC>(QNPC.npc, mapper) {
@Override
protected void query(AbstractSQLQuery<?> q, QNPC e) {
q.where(e.npcId.eq(id.getID()));
}
});
}
@Override
public Collection<NPC> loadAll() {
return database.query(new SelectListQuery<NPC, QNPC>(QNPC.npc, mapper) {
@Override
protected void parametize(PreparedStatement st) throws SQLException {
st.setInt(1, id.getID());
}
@Override
protected Mapper<NPC> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QNPC e) {
}
});
}
@Override
public List<NPC> loadAll() {
return database.query(new SelectListQuery<NPC>() {
public List<NPC> selectByTemplate(final NPCTemplateID templateID) {
return database.query(new SelectListQuery<NPC, QNPC>(QNPC.npc, mapper) {
@Override
protected String query() {
return "SELECT * FROM `" + TABLE + "`";
}
@Override
protected Mapper<NPC> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QNPC e) {
q.where(e.npcTemplateId.eq(templateID.getID()));
}
});
}
@Override
public List<NPC> selectByTemplate(final NPCTemplateID template) {
return database.query(new SelectListQuery<NPC>() {
public Collection<NPCID> selectIDs() {
return database.query(new SelectListQuery<NPCID, QNPC>(QNPC.npc, mapper
.getIDMapper()) {
@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<NPC> mapper() {
return mapper;
protected void query(AbstractSQLQuery<?> q, QNPC e) {
}
});
}
@Override
public List<NPCID> selectIDs() {
return database.query(new SelectListQuery<NPCID>() {
public int insertObjects(NPC... objects) {
return database.query(new InsertQuery<NPC, QNPC, Object>(QNPC.npc,
objects) {
@Override
protected String query() {
return "SELECT `" + NPC_ID + "` FROM `" + TABLE + "`";
}
protected void map(SQLInsertClause q, NPC o) {
q.set(e.npcId, o.getID().getID())
.set(e.npcTemplateId, o.getTemplateID().getID())
.set(e.hp, o.getHP())
.set(e.mp, o.getMP())
.set(e.pointX,
(o.getPoint() != null ? o.getPoint().getX()
: null))
.set(e.pointY,
(o.getPoint() != null ? o.getPoint().getY()
: null))
.set(e.pointZ,
(o.getPoint() != null ? o.getPoint().getZ()
: null))
.set(e.pointAngle,
(o.getPoint() != null ? o.getPoint().getAngle()
: null))
.set(e.respawnTime, o.getRespawnInterval());
@Override
protected Mapper<NPCID> mapper() {
return idMapper;
}
});
}
@Override
public int insertObjects(NPC... npcs) {
return database.query(new InsertUpdateQuery<NPC>(npcs) {
public int updateObjects(NPC... objects) {
return database.query(new UpdateQuery<NPC, QNPC>(QNPC.npc, objects) {
@Override
protected String query() {
return "INSERT INTO `" + TABLE + "` (`" + NPC_ID + "`,`"
+ NPC_TEMPLATE_ID + "`,`" + HP + "`, `" + MP + "`,`"
+ POINT_X + "`,`" + POINT_Y + "`,`" + POINT_Z + "`,`"
+ POINT_ANGLE + "`,`" + RESPAWN_TIME
+ "`) VALUES(?,?,?,?,?,?,?,?,?)";
protected void query(SQLUpdateClause q, NPC o) {
q.where(e.npcId.eq(o.getID().getID()));
}
@Override
protected void parametize(PreparedStatement st, NPC npc)
throws SQLException {
int i = 1;
protected void map(SQLUpdateClause q, NPC o) {
q.set(e.npcId, o.getID().getID())
.set(e.npcTemplateId, o.getTemplateID().getID())
.set(e.hp, o.getHP())
.set(e.mp, o.getMP())
.set(e.pointX,
(o.getPoint() != null ? o.getPoint().getX()
: null))
.set(e.pointY,
(o.getPoint() != null ? o.getPoint().getY()
: null))
.set(e.pointZ,
(o.getPoint() != null ? o.getPoint().getZ()
: null))
.set(e.pointAngle,
(o.getPoint() != null ? o.getPoint().getAngle()
: null))
st.setInt(i++, npc.getID().getID());
st.setInt(i++, npc.getTemplateID().getID());
.set(e.respawnTime, o.getRespawnInterval());
st.setDouble(i++, npc.getHP());
st.setDouble(i++, npc.getMP());
st.setInt(i++, npc.getPoint().getX());
st.setInt(i++, npc.getPoint().getY());
st.setInt(i++, npc.getPoint().getZ());
st.setDouble(i++, npc.getPoint().getAngle());
st.setLong(i++, npc.getRespawnInterval());
}
});
}
@Override
public int updateObjects(NPC... npcs) {
return database.query(new InsertUpdateQuery<NPC>(npcs) {
public int deleteObjects(NPC... objects) {
return database.query(new DeleteQuery<NPC, QNPC>(QNPC.npc, objects) {
@Override
protected String query() {
return "UPDATE `" + TABLE + "` SET `" + NPC_TEMPLATE_ID
+ "` = ?,`" + HP + "` = ?, `" + MP + "` = ?,`"
+ POINT_X + "` = ?,`" + POINT_Y + "` = ?,`" + POINT_Z
+ "` = ?,`" + POINT_ANGLE + "` = ?, `" + RESPAWN_TIME
+ "` = ? WHERE `" + NPC_ID + "` = ?";
}
@Override
protected void parametize(PreparedStatement st, NPC npc)
throws SQLException {
int i = 1;
// SET
st.setInt(i++, npc.getTemplateID().getID());
st.setDouble(i++, npc.getHP());
st.setDouble(i++, npc.getMP());
st.setInt(i++, npc.getPoint().getX());
st.setInt(i++, npc.getPoint().getY());
st.setInt(i++, npc.getPoint().getZ());
st.setDouble(i++, npc.getPoint().getAngle());
st.setLong(i++, npc.getRespawnInterval());
// WHERE
st.setInt(i++, npc.getID().getID());
}
});
}
@Override
public int deleteObjects(NPC... npcs) {
return database.query(new InsertUpdateQuery<NPC>(npcs) {
@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());
protected void query(SQLDeleteClause q, NPC o) {
q.where(e.npcId.eq(o.getID().getID()));
}
});
}

View File

@@ -0,0 +1,76 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import com.google.inject.Inject;
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.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QCharacterFriend;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class CharacterFriendMapper implements
Mapper<CharacterFriend, QCharacterFriend> {
private final Mapper<FriendID, QCharacterFriend> idMapper = new Mapper<FriendID, QCharacterFriend>() {
@Override
public FriendID map(QCharacterFriend e, DatabaseRow row) {
return idProvider.createID(
charIdProvider.resolveID(row.get(e.characterId)),
charIdProvider.resolveID(row.get(e.characterIdFriend)));
}
};
/**
* The {@link CharacterID} provider
*/
private final FriendIDProvider idProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* @param idProvider
* the {@link FriendID} provider
* @param charIdProvider
* the character id provider
*/
@Inject
public CharacterFriendMapper(FriendIDProvider idProvider,
final CharacterIDProvider charIdProvider) {
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
}
@Override
public CharacterFriend map(QCharacterFriend e, DatabaseRow row) {
return new CharacterFriend(idProvider.createID(
charIdProvider.resolveID(row.get(e.characterId)),
charIdProvider.resolveID(row.get(e.characterIdFriend))));
}
public Mapper<FriendID, QCharacterFriend> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,129 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import com.google.inject.Inject;
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.character.CharacterClass;
import com.l2jserver.model.template.character.CharacterTemplate;
import com.l2jserver.model.world.L2Character;
import com.l2jserver.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QCharacter;
import com.l2jserver.util.geometry.Point3D;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class CharacterMapper implements Mapper<L2Character, QCharacter> {
private final Mapper<CharacterID, QCharacter> idMapper = new Mapper<CharacterID, QCharacter>() {
@Override
public CharacterID map(QCharacter e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.characterId));
}
};
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider idProvider;
/**
* The {@link CharacterTemplateID} provider
*/
private final CharacterTemplateIDProvider templateIdProvider;
/**
* The {@link AccountID} provider
*/
private final AccountIDProvider accountIdProvider;
/**
* The {@link ClanID} provider
*/
private final ClanIDProvider clanIdProvider;
/**
* @param idProvider
* the {@link CharacterID} provider
* @param templateIdProvider
* the {@link CharacterTemplateID} provider
* @param accountIdProvider
* the {@link AccountID} provider
* @param clanIdProvider
* the {@link ClanID} provider
*/
@Inject
public CharacterMapper(final CharacterIDProvider idProvider,
CharacterTemplateIDProvider templateIdProvider,
AccountIDProvider accountIdProvider, ClanIDProvider clanIdProvider) {
this.idProvider = idProvider;
this.templateIdProvider = templateIdProvider;
this.accountIdProvider = accountIdProvider;
this.clanIdProvider = clanIdProvider;
}
@Override
public L2Character map(QCharacter e, DatabaseRow row) {
final CharacterClass charClass = row.get(e.characterClass);
final CharacterTemplateID templateId = templateIdProvider
.resolveID(charClass.id);
final CharacterTemplate template = templateId.getTemplate();
final L2Character character = template.create();
character.setID(idProvider.resolveID(row.get(e.characterId)));
character
.setAccountID(accountIdProvider.resolveID(row.get(e.accountId)));
if (!row.isNull(e.clanId))
character.setClanID(clanIdProvider.resolveID(row.get(e.clanId)));
character.setName(row.get(e.name));
character.setRace(row.get(e.race));
character.setCharacterClass(row.get(e.characterClass));
character.setSex(row.get(e.sex));
character.setLevel(row.get(e.level));
character.setExperience(row.get(e.experience));
character.setSP(row.get(e.sp));
character.setHP(row.get(e.hp));
character.setMP(row.get(e.mp));
character.setCP(row.get(e.cp));
character.setPoint(Point3D.fromXYZA(row.get(e.pointX),
row.get(e.pointY), row.get(e.pointZ), row.get(e.pointAngle)));
// appearance
character.getAppearance().setHairStyle(row.get(e.appearanceHairStyle));
character.getAppearance().setHairColor(row.get(e.appearanceHairColor));
character.getAppearance().setFace(row.get(e.apperanceFace));
return character;
}
public Mapper<CharacterID, QCharacter> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,104 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import com.google.inject.Inject;
import com.l2jserver.model.game.CharacterShortcut;
import com.l2jserver.model.game.CharacterShortcut.ShortcutType;
import com.l2jserver.model.id.CharacterShortcutID;
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.provider.CharacterShortcutIDProvider;
import com.l2jserver.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QCharacterShortcut;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class CharacterShortcutMapper implements
Mapper<CharacterShortcut, QCharacterShortcut> {
private final Mapper<CharacterShortcutID, QCharacterShortcut> idMapper = new Mapper<CharacterShortcutID, QCharacterShortcut>() {
@Override
public CharacterShortcutID map(QCharacterShortcut e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.shortcutId));
}
};
/**
* The {@link CharacterShortcutID} provider
*/
private final CharacterShortcutIDProvider idProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* The {@link ItemID} provider
*/
private final ItemIDProvider itemIdProvider;
/**
* @param idProvider
* the {@link CharacterID} provider
* @param charIdProvider
* the character ID provider
* @param itemIdProvider
* the item ID provider
*
*/
@Inject
public CharacterShortcutMapper(
final CharacterShortcutIDProvider idProvider,
CharacterIDProvider charIdProvider, ItemIDProvider itemIdProvider) {
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
this.itemIdProvider = itemIdProvider;
}
@Override
public CharacterShortcut map(QCharacterShortcut e, DatabaseRow row) {
final CharacterShortcut shortcut = new CharacterShortcut();
shortcut.setID(idProvider.resolveID(row.get(e.shortcutId)));
final CharacterID charId = charIdProvider.resolveID(row
.get(e.characterId));
shortcut.setCharacterID(charId);
// resolve type
final ShortcutType type = row.get(e.type);
shortcut.setType(type);
switch (type) {
case ITEM:
final ItemID itemId = itemIdProvider.resolveID(row.get(e.objectId));
shortcut.setItemID(itemId);
break;
}
shortcut.setPage(row.get(e.page));
shortcut.setSlot(row.get(e.slot));
return shortcut;
}
public Mapper<CharacterShortcutID, QCharacterShortcut> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,89 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import com.google.inject.Inject;
import com.l2jserver.model.id.ChatMessageID;
import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.provider.CharacterIDProvider;
import com.l2jserver.model.id.provider.ChatMessageIDProvider;
import com.l2jserver.model.server.ChatMessage;
import com.l2jserver.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QLogChat;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class ChatMessageMapper implements Mapper<ChatMessage, QLogChat> {
private final Mapper<ChatMessageID, QLogChat> idMapper = new Mapper<ChatMessageID, QLogChat>() {
@Override
public ChatMessageID map(QLogChat e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.messageId));
}
};
/**
* The {@link ChatMessageID} provider
*/
private final ChatMessageIDProvider idProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* @param idProvider
* the {@link CharacterID} provider
* @param charIdProvider
* the character ID provider
*
*/
@Inject
public ChatMessageMapper(final ChatMessageIDProvider idProvider,
CharacterIDProvider charIdProvider) {
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
}
@Override
public ChatMessage map(QLogChat e, DatabaseRow row) {
final ChatMessage message = new ChatMessage();
message.setID(idProvider.resolveID(row.get(e.messageId)));
message.setType(row.get(e.type));
switch (message.getType()) {
case SHOUT:
message.setTarget(charIdProvider.resolveID(row.get(e.channelId)));
break;
default:
message.setChannelID(row.get(e.channelId));
break;
}
message.setSender(charIdProvider.resolveID(row.get(e.sender)));
message.setDate(row.get(e.date));
message.setMessage(row.get(e.message));
return message;
}
public Mapper<ChatMessageID, QLogChat> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,75 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import com.google.inject.Inject;
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.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QClan;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class ClanMapper implements Mapper<Clan, QClan> {
private final Mapper<ClanID, QClan> idMapper = new Mapper<ClanID, QClan>() {
@Override
public ClanID map(QClan e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.clanId));
}
};
/**
* The {@link ClanID} provider
*/
private final ClanIDProvider idProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* @param idProvider
* the {@link ClanID} provider
* @param charIdProvider
* the character ID provider
*/
@Inject
public ClanMapper(final ClanIDProvider idProvider,
CharacterIDProvider charIdProvider) {
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
}
@Override
public Clan map(QClan e, DatabaseRow row) {
final Clan clan = new Clan();
clan.setID(idProvider.resolveID(row.get(e.clanId)));
clan.setID(charIdProvider.resolveID(row.get(e.characterIdLeader)));
return clan;
}
public Mapper<ClanID, QClan> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,119 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.l2jserver.model.id.CharacterShortcutID;
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.item.ItemTemplate;
import com.l2jserver.model.world.Item;
import com.l2jserver.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QItem;
import com.l2jserver.util.geometry.Coordinate;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class ItemMapper implements Mapper<Item, QItem> {
/**
* The logger
*/
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final Mapper<ItemID, QItem> idMapper = new Mapper<ItemID, QItem>() {
@Override
public ItemID map(QItem e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.itemId));
}
};
/**
* The {@link CharacterShortcutID} provider
*/
private final ItemIDProvider idProvider;
/**
* The {@link ItemTemplateID} provider
*/
private final ItemTemplateIDProvider templateIdProvider;
/**
* The {@link CharacterID} provider
*/
private final CharacterIDProvider charIdProvider;
/**
* @param idProvider
* the {@link ItemID} provider
* @param templateIdProvider
* the item template id provider
* @param charIdProvider
* the character ID provider
*/
@Inject
public ItemMapper(final ItemIDProvider idProvider,
ItemTemplateIDProvider templateIdProvider,
CharacterIDProvider charIdProvider) {
this.idProvider = idProvider;
this.templateIdProvider = templateIdProvider;
this.charIdProvider = charIdProvider;
}
@Override
public Item map(QItem e, DatabaseRow row) {
final ItemID id = idProvider.resolveID(row.get(e.itemId));
final ItemTemplateID templateId = templateIdProvider.resolveID(row
.get(e.templateId));
final ItemTemplate template = templateId.getTemplate();
if (template == null) {
log.warn("No template found for {} while loading {}", templateId,
id);
return null;
}
final Item item = template.create();
item.setID(id);
if (!row.isNull(e.characterId))
item.setOwnerID(charIdProvider.resolveID(row.get(e.characterId)));
if (!row.isNull(e.location))
item.setLocation(row.get(e.location));
if (!row.isNull(e.paperdoll))
item.setPaperdoll(row.get(e.paperdoll));
item.setCount(row.get(e.count));
if (!row.isNull(e.coordX) && !row.isNull(e.coordY)
&& !row.isNull(e.coordZ))
item.setPosition(Coordinate.fromXYZ(row.get(e.coordX),
row.get(e.coordY), row.get(e.coordZ)));
return item;
}
public Mapper<ItemID, QItem> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,105 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.mapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
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.npc.NPCTemplate;
import com.l2jserver.model.world.NPC;
import com.l2jserver.service.database.dao.DatabaseRow;
import com.l2jserver.service.database.dao.Mapper;
import com.l2jserver.service.database.model.QNPC;
import com.l2jserver.util.geometry.Point3D;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class NPCMapper implements Mapper<NPC, QNPC> {
/**
* The logger
*/
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final Mapper<NPCID, QNPC> idMapper = new Mapper<NPCID, QNPC>() {
@Override
public NPCID map(QNPC e, DatabaseRow row) {
return idProvider.resolveID(row.get(e.npcId));
}
};
/**
* The {@link NPCID} provider
*/
private final NPCIDProvider idProvider;
/**
* The {@link NPCTemplateID} provider
*/
private final NPCTemplateIDProvider templateIdProvider;
/**
* @param idProvider
* the {@link NPCID} provider
* @param templateIdProvider
* the item template id provider
*/
@Inject
public NPCMapper(final NPCIDProvider idProvider,
NPCTemplateIDProvider templateIdProvider) {
this.idProvider = idProvider;
this.templateIdProvider = templateIdProvider;
}
@Override
public NPC map(QNPC e, DatabaseRow row) {
final NPCID id = idProvider.resolveID(row.get(e.npcId));
NPCTemplateID templateId = templateIdProvider.resolveID(row
.get(e.npcTemplateId));
NPCTemplate template = templateId.getTemplate();
if (template == null) {
log.warn("No template found for {}", templateId);
return null;
}
final NPC npc = template.create();
npc.setID(id);
if (!row.isNull(e.hp))
npc.setHP(row.get(e.hp));
if (!row.isNull(e.mp))
npc.setMP(row.get(e.mp));
if (!row.isNull(e.pointX) && !row.isNull(e.pointY)
&& !row.isNull(e.pointZ) && !row.isNull(e.pointAngle))
npc.setPoint(Point3D.fromXYZA(row.get(e.pointX), row.get(e.pointY),
row.get(e.pointZ), row.get(e.pointAngle)));
npc.setRespawnInterval(row.get(e.respawnTime));
return npc;
}
public Mapper<NPCID, QNPC> getIDMapper() {
return idMapper;
}
}

View File

@@ -0,0 +1,45 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.game.Skill;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.sql.RelationalPathBase;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>actor_skill</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QActorSkill extends RelationalPathBase<Skill> {
private static final long serialVersionUID = -146336131;
public static final QActorSkill actorSkill = new QActorSkill("actor_skill");
public final NumberPath<Integer> actorId = createNumber("actor_id",
Integer.class);
public final NumberPath<Integer> level = createNumber("level",
Integer.class);
public final NumberPath<Integer> skillId = createNumber("skill_id",
Integer.class);
public final PrimaryKey<Skill> primary = createPrimaryKey(actorId, skillId);
public QActorSkill(String variable) {
super(Skill.class, forVariable(variable), "null", "actor_skill");
}
public QActorSkill(Path<? extends Skill> entity) {
super(entity.getType(), entity.getMetadata(), "null", "actor_skill");
}
public QActorSkill(PathMetadata<?> metadata) {
super(Skill.class, metadata, "null", "actor_skill");
}
}

View File

@@ -0,0 +1,86 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.template.actor.ActorSex;
import com.l2jserver.model.template.character.CharacterClass;
import com.l2jserver.model.template.character.CharacterRace;
import com.l2jserver.model.world.L2Character;
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.mysema.query.sql.PrimaryKey;
import com.mysema.query.sql.RelationalPathBase;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.EnumPath;
import com.mysema.query.types.path.NumberPath;
import com.mysema.query.types.path.StringPath;
/**
* Maps <code>character</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QCharacter extends RelationalPathBase<L2Character> {
private static final long serialVersionUID = -59499032;
public static final QCharacter character = new QCharacter("l2character");
public final NumberPath<Integer> characterId = createNumber("character_id",
Integer.class);
public final StringPath accountId = createString("account_id");
public final NumberPath<Integer> clanId = createNumber("clan_id",
Integer.class);
public final StringPath name = createString("name");
public final EnumPath<CharacterRace> race = createEnum("race",
CharacterRace.class);
public final EnumPath<ActorSex> sex = createEnum("sex", ActorSex.class);
public final EnumPath<CharacterClass> characterClass = createEnum("class",
CharacterClass.class);
public final NumberPath<Integer> level = createNumber("level",
Integer.class);
public final NumberPath<Long> experience = createNumber("experience",
Long.class);
public final NumberPath<Integer> sp = createNumber("sp", Integer.class);
public final NumberPath<Double> cp = createNumber("cp", Double.class);
public final NumberPath<Double> hp = createNumber("hp", Double.class);
public final NumberPath<Double> mp = createNumber("mp", Double.class);
public final NumberPath<Double> pointAngle = createNumber("point_angle",
Double.class);
public final NumberPath<Integer> pointX = createNumber("point_x",
Integer.class);
public final NumberPath<Integer> pointY = createNumber("point_y",
Integer.class);
public final NumberPath<Integer> pointZ = createNumber("point_z",
Integer.class);
public final EnumPath<CharacterHairColor> appearanceHairColor = createEnum(
"appearance_hair_color", CharacterHairColor.class);
public final EnumPath<CharacterHairStyle> appearanceHairStyle = createEnum(
"appearance_hair_style", CharacterHairStyle.class);
public final EnumPath<CharacterFace> apperanceFace = createEnum(
"apperance_face", CharacterFace.class);
public final PrimaryKey<L2Character> primary = createPrimaryKey(characterId);
public QCharacter(String variable) {
super(L2Character.class, forVariable(variable), "null", "character");
}
public QCharacter(Path<? extends L2Character> entity) {
super(entity.getType(), entity.getMetadata(), "null", "character");
}
public QCharacter(PathMetadata<?> metadata) {
super(L2Character.class, metadata, "null", "character");
}
}

View File

@@ -0,0 +1,45 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.game.CharacterFriend;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>character_friend</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QCharacterFriend extends
com.mysema.query.sql.RelationalPathBase<CharacterFriend> {
private static final long serialVersionUID = 1488651942;
public static final QCharacterFriend characterFriend = new QCharacterFriend(
"character_friend");
public final NumberPath<Integer> characterId = createNumber("character_id",
Integer.class);
public final NumberPath<Integer> characterIdFriend = createNumber(
"character_id_friend", Integer.class);
public final PrimaryKey<CharacterFriend> primary = createPrimaryKey(
characterId, characterIdFriend);
public QCharacterFriend(String variable) {
super(CharacterFriend.class, forVariable(variable), "null",
"character_friend");
}
public QCharacterFriend(Path<? extends CharacterFriend> entity) {
super(entity.getType(), entity.getMetadata(), "null",
"character_friend");
}
public QCharacterFriend(PathMetadata<?> metadata) {
super(CharacterFriend.class, metadata, "null", "character_friend");
}
}

View File

@@ -0,0 +1,55 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.game.CharacterShortcut;
import com.l2jserver.model.game.CharacterShortcut.ShortcutType;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.EnumPath;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>character_shortcut</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QCharacterShortcut extends com.mysema.query.sql.RelationalPathBase<CharacterShortcut> {
private static final long serialVersionUID = 1450964558;
public static final QCharacterShortcut characterShortcut = new QCharacterShortcut("character_shortcut");
public final NumberPath<Integer> characterId = createNumber("character_id", Integer.class);
public final NumberPath<Integer> characterType = createNumber("character_type", Integer.class);
public final NumberPath<Integer> level = createNumber("level", Integer.class);
public final NumberPath<Integer> objectId = createNumber("object_id", Integer.class);
public final NumberPath<Integer> page = createNumber("page", Integer.class);
public final NumberPath<Integer> shortcutId = createNumber("shortcut_id", Integer.class);
public final NumberPath<Integer> slot = createNumber("slot", Integer.class);
public final EnumPath<ShortcutType> type = createEnum("type", ShortcutType.class);
public final PrimaryKey<CharacterShortcut> primary = createPrimaryKey(shortcutId);
public QCharacterShortcut(String variable) {
super(CharacterShortcut.class, forVariable(variable), "null", "character_shortcut");
}
public QCharacterShortcut(Path<? extends CharacterShortcut> entity) {
super(entity.getType(), entity.getMetadata(), "null", "character_shortcut");
}
public QCharacterShortcut(PathMetadata<?> metadata) {
super(CharacterShortcut.class, metadata, "null", "character_shortcut");
}
}

View File

@@ -0,0 +1,41 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.world.Clan;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>clan</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QClan extends com.mysema.query.sql.RelationalPathBase<Clan> {
private static final long serialVersionUID = 1592083511;
public static final QClan clan = new QClan("clan");
public final NumberPath<Integer> characterIdLeader = createNumber("character_id_leader", Integer.class);
public final NumberPath<Integer> clanId = createNumber("clan_id", Integer.class);
public final PrimaryKey<Clan> primary = createPrimaryKey(clanId);
public QClan(String variable) {
super(Clan.class, forVariable(variable), "null", "clan");
}
public QClan(Path<? extends Clan> entity) {
super(entity.getType(), entity.getMetadata(), "null", "clan");
}
public QClan(PathMetadata<?> metadata) {
super(Clan.class, metadata, "null", "clan");
}
}

View File

@@ -0,0 +1,65 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
import com.l2jserver.model.world.character.CharacterInventory.ItemLocation;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.EnumPath;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>item</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QItem extends com.mysema.query.sql.RelationalPathBase<Item> {
private static final long serialVersionUID = 1592270068;
public static final QItem item = new QItem("item");
public final NumberPath<Integer> characterId = createNumber("character_id",
Integer.class);
public final NumberPath<Integer> coordX = createNumber("coord_x",
Integer.class);
public final NumberPath<Integer> coordY = createNumber("coord_y",
Integer.class);
public final NumberPath<Integer> coordZ = createNumber("coord_z",
Integer.class);
public final NumberPath<Long> count = createNumber("count",
Long.class);
public final NumberPath<Integer> itemId = createNumber("item_id",
Integer.class);
public final EnumPath<ItemLocation> location = createEnum("location",
ItemLocation.class);
public final EnumPath<InventoryPaperdoll> paperdoll = createEnum(
"paperdoll", InventoryPaperdoll.class);
public final NumberPath<Integer> templateId = createNumber("template_id",
Integer.class);
public final PrimaryKey<Item> primary = createPrimaryKey(itemId);
public QItem(String variable) {
super(Item.class, forVariable(variable), "null", "item");
}
public QItem(Path<? extends Item> entity) {
super(entity.getType(), entity.getMetadata(), "null", "item");
}
public QItem(PathMetadata<?> metadata) {
super(Item.class, metadata, "null", "item");
}
}

View File

@@ -0,0 +1,57 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import java.util.Date;
import com.l2jserver.model.server.ChatMessage;
import com.l2jserver.service.game.chat.ChatMessageType;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.DateTimePath;
import com.mysema.query.types.path.EnumPath;
import com.mysema.query.types.path.NumberPath;
import com.mysema.query.types.path.StringPath;
/**
* Maps <code>log_chat</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QLogChat extends com.mysema.query.sql.RelationalPathBase<ChatMessage> {
private static final long serialVersionUID = -76124357;
public static final QLogChat logChat = new QLogChat("log_chat");
public final NumberPath<Integer> channelId = createNumber("channel_id",
Integer.class);
public final DateTimePath<Date> date = createDateTime("date", Date.class);
public final StringPath message = createString("message");
public final NumberPath<Integer> messageId = createNumber("message_id",
Integer.class);
public final NumberPath<Integer> sender = createNumber("sender",
Integer.class);
public final EnumPath<ChatMessageType> type = createEnum("type",
ChatMessageType.class);
public final PrimaryKey<ChatMessage> primary = createPrimaryKey(messageId);
public QLogChat(String variable) {
super(ChatMessage.class, forVariable(variable), "null", "log_chat");
}
public QLogChat(Path<? extends ChatMessage> entity) {
super(entity.getType(), entity.getMetadata(), "null", "log_chat");
}
public QLogChat(PathMetadata<?> metadata) {
super(ChatMessage.class, metadata, "null", "log_chat");
}
}

View File

@@ -0,0 +1,55 @@
package com.l2jserver.service.database.model;
import static com.mysema.query.types.PathMetadataFactory.forVariable;
import com.l2jserver.model.world.NPC;
import com.mysema.query.sql.PrimaryKey;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.path.NumberPath;
/**
* Maps <code>npc</code> table into type-safe java objects
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class QNPC extends com.mysema.query.sql.RelationalPathBase<NPC> {
private static final long serialVersionUID = 2129578208;
public static final QNPC npc = new QNPC("npc");
public final NumberPath<Double> hp = createNumber("hp", Double.class);
public final NumberPath<Double> mp = createNumber("mp", Double.class);
public final NumberPath<Integer> npcId = createNumber("npc_id", Integer.class);
public final NumberPath<Integer> npcTemplateId = createNumber("npc_template_id", Integer.class);
public final NumberPath<Double> pointAngle = createNumber("point_angle", Double.class);
public final NumberPath<Integer> pointX = createNumber("point_x", Integer.class);
public final NumberPath<Integer> pointY = createNumber("point_y", Integer.class);
public final NumberPath<Integer> pointZ = createNumber("point_z", Integer.class);
public final NumberPath<Long> respawnTime = createNumber("respawn_time", Long.class);
public final PrimaryKey<NPC> primary = createPrimaryKey(npcId);
public QNPC(String variable) {
super(NPC.class, forVariable(variable), "null", "npc");
}
public QNPC(Path<? extends NPC> entity) {
super(entity.getType(), entity.getMetadata(), "null", "npc");
}
public QNPC(PathMetadata<?> metadata) {
super(NPC.class, metadata, "null", "npc");
}
}

View File

@@ -1,465 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.orientdb;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.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.actor.ActorSex;
import com.l2jserver.model.template.character.CharacterClass;
import com.l2jserver.model.template.character.CharacterRace;
import com.l2jserver.model.template.character.CharacterTemplate;
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.service.database.AbstractOrientDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.util.geometry.Point3D;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.query.nativ.ONativeSynchQuery;
import com.orientechnologies.orient.core.query.nativ.OQueryContextNative;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
*/
public class OrientDBCharacterDAO extends
AbstractOrientDBDAO<L2Character, CharacterID> 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 CLASS_NAME = L2Character.class.getSimpleName();
// 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";
/**
* The mapper for {@link CharacterID}
*/
private final Mapper<CharacterID> idMapper = new Mapper<CharacterID>() {
@Override
public CharacterID map(ODocument document) throws SQLException {
return idFactory.resolveID((Integer) document.field(CHAR_ID));
}
};
/**
* The {@link Mapper} for {@link L2Character}
*/
private final Mapper<L2Character> mapper = new CachedMapper<L2Character, CharacterID>(
database, idMapper) {
@Override
protected L2Character map(CharacterID id, ODocument document)
throws SQLException {
final CharacterClass charClass = (CharacterClass) document
.field(CLASS);
final CharacterTemplateID templateId = templateIdFactory
.resolveID(charClass.id);
final CharacterTemplate template = templateId.getTemplate();
final L2Character character = template.create();
character.setID(id);
character.setAccountID(accountIdFactory.resolveID((String) document
.field(ACCOUNT_ID)));
if (document.containsField(CLAN_ID))
character.setClanID(clanIdFactory.resolveID((Integer) document
.field(CLAN_ID)));
character.setName((String) document.field(NAME));
character.setRace((CharacterRace) document.field(RACE));
character.setCharacterClass((CharacterClass) document.field(CLASS));
character.setSex((ActorSex) document.field(SEX));
character.setLevel((Integer) document.field(LEVEL));
character.setExperience((Long) document.field(EXPERIENCE));
character.setSP((Integer) document.field(SP));
character.setHP((Double) document.field(HP));
character.setMP((Double) document.field(MP));
character.setCP((Double) document.field(CP));
character.setPoint(Point3D.fromXYZA(
(Integer) document.field(POINT_X),
(Integer) document.field(POINT_Y),
(Integer) document.field(POINT_Z),
(Double) document.field(POINT_ANGLE)));
// appearance
character.getAppearance().setHairStyle(
(CharacterHairStyle) document.field(APPEARANCE_HAIR_STYLE));
character.getAppearance().setHairColor(
(CharacterHairColor) document.field(APPEARANCE_HAIR_COLOR));
character.getAppearance().setFace(
(CharacterFace) document.field(APPEARANCE_FACE));
return character;
}
};
/**
* @param database
* the database service
* @param idFactory
* the character id provider
* @param templateIdFactory
* the template id provider
* @param accountIdFactory
* the account id provider
* @param clanIdFactory
* the clan id provider
*/
@Inject
protected OrientDBCharacterDAO(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;
}
@Override
public L2Character select(final CharacterID id) {
return database.query(new SelectSingleQuery<L2Character>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID).eq(id.getID()).go();
}
};
}
@Override
protected Mapper<L2Character> mapper() {
return mapper;
}
});
}
@Override
public Collection<CharacterID> selectIDs() {
return database.query(new SelectListQuery<CharacterID>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return true;
};
};
}
@Override
protected Mapper<CharacterID> mapper() {
return idMapper;
}
});
}
@Override
public int insertObjects(L2Character... objects) {
return database.query(new InsertUpdateQuery<L2Character>(objects) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, L2Character object) {
return null;
}
@Override
protected ODocument update(ODocument document, L2Character character)
throws SQLException {
return null;
}
@Override
protected ODocument insert(ODocument document, L2Character character)
throws SQLException {
final CharacterAppearance appearance = character
.getAppearance();
document.field(CHAR_ID, character.getID().getID());
document.field(ACCOUNT_ID, character.getAccountID().getID());
if (character.getClanID() != null)
document.field(CLAN_ID, character.getClanID().getID());
document.field(NAME, character.getName());
document.field(RACE, character.getRace().name());
document.field(CLASS, character.getCharacterClass().name());
document.field(SEX, character.getSex().name());
document.field(LEVEL, character.getLevel());
document.field(EXPERIENCE, character.getExperience());
document.field(SP, character.getSP());
document.field(HP, character.getHP());
document.field(MP, character.getMP());
document.field(CP, character.getCP());
document.field(POINT_X, character.getPoint().getX());
document.field(POINT_Y, character.getPoint().getY());
document.field(POINT_Z, character.getPoint().getZ());
document.field(POINT_ANGLE, character.getPoint().getAngle());
// appearance
document.field(APPEARANCE_HAIR_STYLE, appearance.getHairStyle()
.name());
document.field(APPEARANCE_HAIR_COLOR, appearance.getHairColor()
.name());
document.field(APPEARANCE_FACE, appearance.getFace().name());
return document;
}
});
}
@Override
public int updateObjects(final L2Character... characters) {
return database.query(new InsertUpdateQuery<L2Character>(characters) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, final L2Character character) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID)
.eq(character.getID().getID()).go();
};
};
}
@Override
protected ODocument update(ODocument document, L2Character character)
throws SQLException {
final CharacterAppearance appearance = character
.getAppearance();
document.field(ACCOUNT_ID, character.getAccountID().getID());
if (character.getClanID() != null)
document.field(CLAN_ID, character.getClanID().getID());
document.field(NAME, character.getName());
document.field(RACE, character.getRace().name());
document.field(CLASS, character.getCharacterClass().name());
document.field(SEX, character.getSex().name());
document.field(LEVEL, character.getLevel());
document.field(EXPERIENCE, character.getExperience());
document.field(SP, character.getSP());
document.field(HP, character.getHP());
document.field(MP, character.getMP());
document.field(CP, character.getCP());
document.field(POINT_X, character.getPoint().getX());
document.field(POINT_Y, character.getPoint().getY());
document.field(POINT_Z, character.getPoint().getZ());
document.field(POINT_ANGLE, character.getPoint().getAngle());
// appearance
document.field(APPEARANCE_HAIR_STYLE, appearance.getHairStyle()
.name());
document.field(APPEARANCE_HAIR_COLOR, appearance.getHairColor()
.name());
document.field(APPEARANCE_FACE, appearance.getFace().name());
return document;
}
@Override
protected ODocument insert(ODocument document, L2Character character)
throws SQLException {
return null;
}
});
}
@Override
public int deleteObjects(L2Character... objects) {
return database.query(new InsertUpdateQuery<L2Character>(objects) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, final L2Character character) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID)
.eq(character.getID().getID()).go();
};
};
}
@Override
protected ODocument update(ODocument document, L2Character character)
throws SQLException {
document.delete();
return null;
}
@Override
protected ODocument insert(ODocument document, L2Character character)
throws SQLException {
return null;
}
});
}
@Override
public void load(Clan clan) {
}
@Override
public L2Character selectByName(final String name) {
return database.query(new SelectSingleQuery<L2Character>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(NAME).eq(name).go();
};
};
}
@Override
protected Mapper<L2Character> mapper() {
return mapper;
}
});
}
@Override
public List<L2Character> selectByAccount(final AccountID account) {
return database.query(new SelectListQuery<L2Character>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(ACCOUNT_ID).eq(account.getID())
.go();
};
};
}
@Override
protected Mapper<L2Character> mapper() {
return mapper;
}
});
}
@Override
protected L2Character[] wrap(Model<?>... objects) {
final L2Character[] array = new L2Character[objects.length];
int i = 0;
for (final Model<?> object : objects) {
array[i++] = (L2Character) object;
}
return array;
}
}

View File

@@ -1,285 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.orientdb;
import java.sql.SQLException;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.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.AbstractOrientDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.database.jdbc.JDBCCharacterDAO;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.query.nativ.ONativeSynchQuery;
import com.orientechnologies.orient.core.query.nativ.OQueryContextNative;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* {@link CharacterFriendDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class OrientDBCharacterFriendDAO extends
AbstractOrientDBDAO<CharacterFriend, FriendID> 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 CLASS_NAME = CharacterFriend.class
.getSimpleName();
// FIELDS
public static final String CHAR_ID = JDBCCharacterDAO.CHAR_ID;
public static final String CHAR_ID_FRIEND = JDBCCharacterDAO.CHAR_ID
+ "_friend";
/**
* @param database
* the database service
* @param idProvider
* the frind id provider
* @param charIdProvider
* the character id provider
*/
@Inject
public OrientDBCharacterFriendDAO(DatabaseService database,
final FriendIDProvider idProvider,
CharacterIDProvider charIdProvider) {
super(database);
this.idProvider = idProvider;
this.charIdProvider = charIdProvider;
}
/**
* The {@link Mapper} for {@link FriendID}
*/
private final Mapper<FriendID> idMapper = new Mapper<FriendID>() {
@Override
public FriendID map(ODocument document) throws SQLException {
final CharacterID characterId = charIdProvider
.resolveID((Integer) document.field(CHAR_ID));
final CharacterID friendId = charIdProvider
.resolveID((Integer) document.field(CHAR_ID_FRIEND));
return idProvider.createID(characterId, friendId);
}
};
/**
* The {@link Mapper} for {@link CharacterFriend}
*/
private final Mapper<CharacterFriend> mapper = new CachedMapper<CharacterFriend, FriendID>(
database, idMapper) {
@Override
protected CharacterFriend map(FriendID id, ODocument document)
throws SQLException {
return new CharacterFriend(id);
}
};
@Override
public CharacterFriend select(final FriendID id) {
return database.query(new SelectSingleQuery<CharacterFriend>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID).eq(id.getID1().getID())
.field(CHAR_ID_FRIEND).eq(id.getID2().getID())
.go();
};
};
}
@Override
protected Mapper<CharacterFriend> mapper() {
return mapper;
}
});
}
@Override
public void load(final L2Character character) {
final List<CharacterFriend> list = database
.query(new SelectListQuery<CharacterFriend>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(
database, CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID)
.eq(character.getID().getID()).go();
};
};
}
@Override
protected Mapper<CharacterFriend> mapper() {
return mapper;
}
});
character.getFriendList().load(list);
}
@Override
public List<FriendID> selectIDs() {
return database.query(new SelectListQuery<FriendID>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return true;
};
};
}
@Override
protected Mapper<FriendID> mapper() {
return idMapper;
}
});
}
@Override
public int insertObjects(CharacterFriend... friends) {
return database.query(new InsertUpdateQuery<CharacterFriend>(friends) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, CharacterFriend object) {
return null;
}
@Override
protected ODocument update(ODocument document,
CharacterFriend object) throws SQLException {
return null;
}
@Override
protected ODocument insert(ODocument document,
CharacterFriend friend) throws SQLException {
document.field(CHAR_ID, friend.getCharacterID());
document.field(CHAR_ID_FRIEND, friend.getFriendID());
return document;
}
});
}
@Override
public int updateObjects(CharacterFriend... friends) {
// it is not possible update friend objects, because they are only a ID
// pair and IDs are immutable
return 0;
}
@Override
public int deleteObjects(CharacterFriend... friends) {
return database.query(new InsertUpdateQuery<CharacterFriend>(friends) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, final CharacterFriend friend) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CHAR_ID)
.eq(friend.getCharacterID().getID()).and()
.field(CHAR_ID_FRIEND)
.eq(friend.getFriendID().getID()).go();
};
};
}
@Override
protected ODocument update(ODocument document,
CharacterFriend object) throws SQLException {
document.delete();
return null;
}
@Override
protected ODocument insert(ODocument document,
CharacterFriend friend) throws SQLException {
return null;
}
});
}
@Override
public boolean save(final CharacterFriendList friends) {
for (final CharacterFriend friend : friends) {
if (save(friend) == 0)
return false;
}
return true;
}
@Override
public boolean delete(final CharacterFriendList friends) {
for (final CharacterFriend friend : friends) {
if (deleteObjects(friend) == 0)
return false;
}
return true;
}
@Override
protected CharacterFriend[] wrap(Model<?>... objects) {
final CharacterFriend[] array = new CharacterFriend[objects.length];
int i = 0;
for (final Model<?> object : objects) {
array[i++] = (CharacterFriend) object;
}
return array;
}
}

View File

@@ -1,264 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.orientdb;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.model.dao.ChatMessageDAO;
import com.l2jserver.model.id.ChatMessageID;
import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.provider.CharacterIDProvider;
import com.l2jserver.model.id.provider.ChatMessageIDProvider;
import com.l2jserver.model.server.ChatMessage;
import com.l2jserver.service.database.AbstractOrientDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.game.chat.ChatMessageType;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.query.nativ.ONativeSynchQuery;
import com.orientechnologies.orient.core.query.nativ.OQueryContextNative;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* {@link CharacterDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class OrientDBChatMessageDAO extends
AbstractOrientDBDAO<ChatMessage, ChatMessageID> implements
ChatMessageDAO {
/**
* The {@link ChatMessageID} factory
*/
private final ChatMessageIDProvider idFactory;
/**
* The {@link CharacterID} factory
*/
private final CharacterIDProvider charIdFactory;
/**
* Character table name
*/
public static final String CLASS_NAME = ChatMessage.class.getSimpleName();
// FIELDS
public static final String MESSAGE_ID = "message_id";
public static final String TYPE = "type";
public static final String CHANNEL_ID = "channel_id";
public static final String SENDER = "sender";
public static final String DATE = "date";
public static final String MESSAGE = "message";
/**
* @param database
* the database service
* @param idFactory
* the chat message id provider
* @param charIdFactory
* the character id provider
*/
@Inject
public OrientDBChatMessageDAO(DatabaseService database,
ChatMessageIDProvider idFactory,
final CharacterIDProvider charIdFactory) {
super(database);
this.idFactory = idFactory;
this.charIdFactory = charIdFactory;
}
/**
* The {@link Mapper} for {@link ChatMessageID}
*/
private final Mapper<ChatMessageID> idMapper = new Mapper<ChatMessageID>() {
@Override
public ChatMessageID map(ODocument document) throws SQLException {
return idFactory.resolveID((Integer) document.field(MESSAGE_ID));
}
};
/**
* The {@link Mapper} for {@link ChatMessage}
*/
private final Mapper<ChatMessage> mapper = new CachedMapper<ChatMessage, ChatMessageID>(
database, idMapper) {
@Override
protected ChatMessage map(ChatMessageID id, ODocument document)
throws SQLException {
final ChatMessage message = new ChatMessage();
message.setID(id);
message.setType(ChatMessageType.valueOf((String) document
.field(TYPE)));
switch (message.getType()) {
case SHOUT:
message.setTarget(charIdFactory.resolveID((Integer) document
.field(CHANNEL_ID)));
break;
default:
message.setChannelID((Integer) document.field(CHANNEL_ID));
break;
}
message.setSender(charIdFactory.resolveID((Integer) document
.field(SENDER)));
message.setDate((Date) document.field(DATE));
message.setMessage((String) document.field(MESSAGE));
return message;
}
};
@Override
public ChatMessage select(final ChatMessageID id) {
return database.query(new SelectSingleQuery<ChatMessage>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(MESSAGE_ID).eq(id.getID()).go();
};
};
}
@Override
protected Mapper<ChatMessage> mapper() {
return mapper;
}
});
}
@Override
public List<ChatMessageID> selectIDs() {
return database.query(new SelectListQuery<ChatMessageID>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return true;
};
};
}
@Override
protected Mapper<ChatMessageID> mapper() {
return idMapper;
}
});
}
@Override
public int insertObjects(ChatMessage... messages) {
return database.query(new InsertUpdateQuery<ChatMessage>(messages) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, ChatMessage object) {
return null;
}
@Override
protected ODocument update(ODocument document, ChatMessage object)
throws SQLException {
return null;
}
@Override
protected ODocument insert(ODocument document, ChatMessage message)
throws SQLException {
document.field(TYPE, message.getType().name());
switch (message.getType()) {
case SHOUT:
document.field(CHANNEL_ID, message.getTarget().getID());
break;
default:
document.field(CHANNEL_ID, message.getChannelID());
break;
}
document.field(SENDER, message.getTarget().getID());
document.field(DATE, message.getDate());
document.field(MESSAGE, message.getMessage());
return document;
}
});
}
@Override
public int updateObjects(ChatMessage... messages) {
// cannot update chat message logs
return 0;
}
@Override
public int deleteObjects(ChatMessage... messages) {
return database.query(new InsertUpdateQuery<ChatMessage>(messages) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, final ChatMessage message) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(MESSAGE_ID).eq(message.getID())
.and().go();
};
};
}
@Override
protected ODocument update(ODocument document, ChatMessage object)
throws SQLException {
document.delete();
return null;
}
@Override
protected ODocument insert(ODocument document, ChatMessage object)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
});
}
@Override
protected ChatMessage[] wrap(Model<?>... objects) {
final ChatMessage[] array = new ChatMessage[objects.length];
int i = 0;
for (final Model<?> object : objects) {
array[i++] = (ChatMessage) object;
}
return array;
}
}

View File

@@ -1,231 +0,0 @@
/*
* This file is part of l2jserver2 <l2jserver2.com>.
*
* l2jserver2 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.
*
* l2jserver2 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 l2jserver2. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.service.database.orientdb;
import java.sql.SQLException;
import java.util.List;
import com.google.inject.Inject;
import com.l2jserver.model.Model;
import com.l2jserver.model.dao.CharacterDAO;
import com.l2jserver.model.dao.ClanDAO;
import com.l2jserver.model.id.ChatMessageID;
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.AbstractOrientDatabaseService.CachedMapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.InsertUpdateQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.Mapper;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectListQuery;
import com.l2jserver.service.database.AbstractOrientDatabaseService.SelectSingleQuery;
import com.l2jserver.service.database.DatabaseService;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.query.nativ.ONativeSynchQuery;
import com.orientechnologies.orient.core.query.nativ.OQueryContextNative;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* {@link CharacterDAO} implementation for JDBC
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public class OrientDBClanDAO extends AbstractOrientDBDAO<Clan, ClanID>
implements ClanDAO {
/**
* The {@link ChatMessageID} factory
*/
private final ClanIDProvider idFactory;
/**
* The {@link CharacterID} factory
*/
private final CharacterIDProvider charIdFactory;
/**
* Clan table name
*/
public static final String CLASS_NAME = Clan.class.getSimpleName();
// FIELDS
public static final String CLAN_ID = "clan_id";
public static final String CHAR_ID_LEADER = "character_id_leader";
/**
* @param database
* the database service
* @param idFactory
* the chat message id provider
* @param charIdFactory
* the character id provider
*/
@Inject
public OrientDBClanDAO(DatabaseService database, ClanIDProvider idFactory,
final CharacterIDProvider charIdFactory) {
super(database);
this.idFactory = idFactory;
this.charIdFactory = charIdFactory;
}
/**
* The {@link Mapper} for {@link ClanID}
*/
private final Mapper<ClanID> idMapper = new Mapper<ClanID>() {
@Override
public ClanID map(ODocument document) throws SQLException {
return idFactory.resolveID((Integer) document.field(CLAN_ID));
}
};
/**
* The {@link Mapper} for {@link Clan}
*/
private final Mapper<Clan> mapper = new CachedMapper<Clan, ClanID>(
database, idMapper) {
@Override
protected Clan map(ClanID id, ODocument document) throws SQLException {
final Clan clan = new Clan();
clan.setID(id);
clan.setLeaderID(charIdFactory.resolveID((Integer) document
.field(CHAR_ID_LEADER)));
return clan;
}
};
@Override
public Clan select(final ClanID id) {
return database.query(new SelectSingleQuery<Clan>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CLAN_ID).eq(id.getID()).go();
};
};
}
@Override
protected Mapper<Clan> mapper() {
return mapper;
}
});
}
@Override
public List<ClanID> selectIDs() {
return database.query(new SelectListQuery<ClanID>() {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return true;
};
};
}
@Override
protected Mapper<ClanID> mapper() {
return idMapper;
}
});
}
@Override
public int insertObjects(Clan... clans) {
return database.query(new InsertUpdateQuery<Clan>(clans) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, Clan object) {
return null;
}
@Override
protected ODocument update(ODocument document, Clan object)
throws SQLException {
return null;
}
@Override
protected ODocument insert(ODocument document, Clan clan)
throws SQLException {
document.field(CLAN_ID, clan.getID().getID());
document.field(CHAR_ID_LEADER, clan.getLeaderID().getID());
return document;
}
});
}
@Override
public int updateObjects(Clan... clans) {
// cannot update chat message logs
return 0;
}
@Override
public int deleteObjects(Clan... clans) {
return database.query(new InsertUpdateQuery<Clan>(clans) {
@Override
protected ONativeSynchQuery<OQueryContextNative> createQuery(
ODatabaseDocumentTx database, final Clan clan) {
return new ONativeSynchQuery<OQueryContextNative>(database,
CLASS_NAME, new OQueryContextNative()) {
private static final long serialVersionUID = 1L;
@Override
public boolean filter(OQueryContextNative criteria) {
return criteria.field(CLAN_ID).eq(clan.getID()).go();
};
};
}
@Override
protected ODocument update(ODocument document, Clan clan)
throws SQLException {
document.delete();
return null;
}
@Override
protected ODocument insert(ODocument document, Clan object)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
});
}
@Override
protected Clan[] wrap(Model<?>... objects) {
final Clan[] array = new Clan[objects.length];
int i = 0;
for (final Model<?> object : objects) {
array[i++] = (Clan) object;
}
return array;
}
}

View File

@@ -16,10 +16,10 @@
*/
package com.l2jserver.db.dao.mysql5;
import junit.framework.Assert;
import org.junit.Assert;
import org.junit.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Stage;
@@ -30,17 +30,28 @@ import com.l2jserver.model.world.L2Character;
import com.l2jserver.service.ServiceManager;
import com.l2jserver.service.ServiceStartException;
import com.l2jserver.service.database.DatabaseService;
import com.l2jserver.service.database.mapper.CharacterFriendMapper;
import com.l2jserver.service.database.mapper.CharacterMapper;
import com.l2jserver.service.database.mapper.CharacterShortcutMapper;
import com.l2jserver.service.game.template.TemplateService;
import com.l2jserver.service.game.world.WorldService;
public class MySQL5CharacterDAOTest {
private final Injector injector = Guice.createInjector(Stage.PRODUCTION,
new GameServerModule());
new GameServerModule(), new AbstractModule() {
@Override
protected void configure() {
bind(CharacterMapper.class);
bind(CharacterFriendMapper.class);
bind(CharacterShortcutMapper.class);
}
});
@Test
public void testCachedLoad() throws ServiceStartException {
injector.getInstance(ServiceManager.class).start(TemplateService.class);
injector.getInstance(ServiceManager.class).start(DatabaseService.class);
injector.getInstance(ServiceManager.class).start(
DatabaseService.class);
injector.getInstance(ServiceManager.class).start(WorldService.class);
final CharacterDAO dao = injector.getInstance(CharacterDAO.class);
@@ -49,6 +60,6 @@ public class MySQL5CharacterDAOTest {
final L2Character char2 = dao.select(injector.getInstance(
CharacterIDProvider.class).resolveID(268437456));
Assert.assertSame(char1, char2);
Assert.assertSame(char1, char2);
}
}