diff --git a/.project b/.project index 72f65b4..463409a 100644 --- a/.project +++ b/.project @@ -32,5 +32,6 @@ org.eclipse.wst.common.modulecore.ModuleCoreNature org.eclipse.jem.workbench.JavaEMFNature org.eclipse.buildship.core.gradleprojectnature + net.sf.eclipse.tomcat.tomcatnature diff --git a/src/main/java/cactusServer/entities/Account.java b/src/main/java/cactusServer/entities/Account.java index e5153d6..a075657 100644 --- a/src/main/java/cactusServer/entities/Account.java +++ b/src/main/java/cactusServer/entities/Account.java @@ -34,7 +34,7 @@ this.name = name; } - @JSONHint(ignore = true) + @JSONHint(ignore=true) public String getPass() { return pass; } @@ -43,7 +43,7 @@ this.pass = pass; } - @JSONHint(ignore = true) + @JSONHint(ignore=true) public boolean isLogin() { return login; } @@ -61,7 +61,7 @@ return token; } - @JSONHint(ignore = true) + @JSONHint(ignore=true) public String getUniqueID() { return uniqueID; } diff --git a/src/main/java/cactusServer/entities/Area.java b/src/main/java/cactusServer/entities/Area.java index 3dc0ee4..20496b4 100644 --- a/src/main/java/cactusServer/entities/Area.java +++ b/src/main/java/cactusServer/entities/Area.java @@ -2,25 +2,30 @@ import java.util.HashSet; -public class Area extends Entity{ +import framework.model3D.Position3D; +import net.arnx.jsonic.JSONHint; + +public class Area extends Entity { private String name; private Plain[] region; // �C�ӌ‚̕��ʂ̕����� private HashSet permissions; // �G���A���ʼn”\�Ȃ��Ƃ̗��� + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; private Area() { // JSONDecode���̌Ăяo���p } - + public Area(String name, Plain[] region, HashSet permissions) { setName(name); setRegion(region); setPermissions(permissions); } - + public String getName() { return name; } - + public Plain[] getRegion() { return region; } @@ -28,35 +33,47 @@ public Plain getRegion(int index) { return region[index]; } - + public HashSet getPermissions() { return permissions; } - + public boolean isPermission(Allowed allowed) { return permissions.contains(allowed); } + public boolean isSurroundingPosition(Position3D position) { + for (Plain plain : region) { + // ������ Plain��a,b,c,d �� Character��x,y,z ��p����, �L�����N�^�[�����ʂ̗��ɂ��邩�ǂ����̔�����s�� + double equation = (plain.getA() * position.getX()) + (plain.getB() * position.getY()) + + (plain.getC() * position.getZ()) + plain.getD(); + if (equation > 0) { + return false; + } + } + return true; + } + public void setName(String name) { this.name = name; } - + public void setRegion(Plain[] region) { this.region = region; } - + public void setPermissions(HashSet permissions) { this.permissions = permissions; } - + public void addPermission(Allowed allowed) { permissions.add(allowed); } - + public void removePermission(Allowed allowed) { permissions.remove(allowed); } - + public static enum Allowed { SHOOT, KILL; } diff --git a/src/main/java/cactusServer/entities/Character.java b/src/main/java/cactusServer/entities/Character.java index f435a04..08c2516 100644 --- a/src/main/java/cactusServer/entities/Character.java +++ b/src/main/java/cactusServer/entities/Character.java @@ -1,43 +1,54 @@ package cactusServer.entities; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import cactusServer.models.Instances; import cactusServer.utils.RandomStringGenerator; import framework.model3D.Position3D; import net.arnx.jsonic.JSONHint; -public class Character extends Entity{ +public class Character extends Entity { private String accountURI; private String name; private Position3D position; private Angle angle; - private CharacterModel model; + private String model; private String areaURI; - private HashMap itemMap = new HashMap<>(); - private static final int UNIQUE_ID_LENGTH = 12; + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; private Character() { // JSONDecode���̌Ăяo���p } - - public Character(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) { + + // public Character(String accountURI, String name, Position3D position, Angle + // angle, String model) { + // setAccountURI(accountURI); + // setName(name); + // setPosition(position); + // setAngle(angle); + // setModel(model); + // updateAreaURI(); + // } + + public Character(String instanceId, String accountURI, String name, Position3D position, Angle angle, + String model) { setAccountURI(accountURI); setName(name); setPosition(position); setAngle(angle); setModel(model); - updateAreaURI(); + initAreaURI(instanceId); } public String getAccountURI() { return accountURI; } - + public String getName() { return name; } @@ -45,23 +56,25 @@ public Position3D getPosition() { return position; } - + public Angle getAngle() { return angle; } - public CharacterModel getModel() { + public String getModel() { return model; } - + public String getAreaURI() { return areaURI; } - + + @JSONHint(ignore = true) public Item getItem(String itemId) { return itemMap.get(itemId); } - + + @JSONHint(ignore = true) public List getItems() { List itemList = new ArrayList<>(); for (Item item : itemMap.values()) { @@ -73,7 +86,7 @@ public void setAccountURI(String accountURI) { this.accountURI = accountURI; } - + public void setName(String name) { this.name = name; } @@ -81,15 +94,15 @@ public void setPosition(Position3D position) { this.position = position; } - + public void setAngle(Angle angle) { this.angle = angle; } - public void setModel(CharacterModel model) { + public void setModel(String model) { this.model = model; } - + public void setAreaURI(String areaURI) { this.areaURI = areaURI; } @@ -97,13 +110,14 @@ public AddressedEntity createItem(String name, int amount) { Item item = new Item(name, amount); if (!hasItem(item)) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet()); + String id = RandomStringGenerator.generateUniqueString(Item.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet()); itemMap.put(id, item); return new IDAddressedEntity(id, item); } return null; } - + public boolean hasItem(Item item) { for (Map.Entry entry : itemMap.entrySet()) { if (entry.getValue().equals(item)) { @@ -112,7 +126,7 @@ } return false; } - + public Item changeAmountOfItem(String itemId, int amountOfChange) { Item item = itemMap.get(itemId).changeAmount(amountOfChange); if (item.isEmpty()) { @@ -120,11 +134,51 @@ } return item; } - - private void updateAreaURI() { - // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + + private void initAreaURI(String instanceId) { + Instance instance = Instances.getInstance().getInstance(instanceId); + setAreaURI(findAreaURI(instance)); } - + + private String findAreaURI(Instance instance) { + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + for (String areaId : instance.getAreaIdSet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; + StringBuilder newAreaURI = new StringBuilder(); + return newAreaURI.append(areaURI.substring(0, subStringEndIndex)).append(areaId).toString(); + } + } + return ""; + } + + public void update(Position3D position, Angle angle, String model, String areaURI) { + setPosition(position); + setAngle(angle); + if (model != null) { + setModel(model); + } + if (areaURI != null) { + setAreaURI(areaURI); + } else { + updateAreaURI(); + } + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // �c�c/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + setAreaURI(findAreaURI(instance)); + } + } + public Item destroyItem(String itemId) { return itemMap.remove(itemId); } diff --git a/src/main/java/cactusServer/entities/Instance.java b/src/main/java/cactusServer/entities/Instance.java index 650f494..e8860ad 100644 --- a/src/main/java/cactusServer/entities/Instance.java +++ b/src/main/java/cactusServer/entities/Instance.java @@ -1,18 +1,15 @@ package cactusServer.entities; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import cactusServer.entities.Entity; import cactusServer.entities.Object; import cactusServer.entities.Area.Allowed; import cactusServer.entities.Object.Attribute; -import cactusServer.models.Instances; import cactusServer.utils.RandomStringGenerator; import cactusServer.entities.Character; import framework.model3D.Position3D; @@ -22,28 +19,31 @@ /** * �C���X�^���X - * @author ryo isitani + * + * @author r-isitani * */ public class Instance extends Entity { private String name; private State state; - private StageModel stage; - + private String stage; private HashMap areaMap = new HashMap<>(); private HashMap objMap = new HashMap<>(); private HashMap characterMap = new HashMap<>(); - private static final int UNIQUE_ID_LENGTH = 12; + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; private Instance() { // JSONDecode���̌Ăяo���p } - + /** * (�����͌����_�ł̉��̂���) - * @param name �C���X�^���X�� + * + * @param name + * �C���X�^���X�� */ - public Instance(String name, State state, StageModel stageModel) { + public Instance(String name, State state, String stageModel) { setName(name); setState(state); setStage(stageModel); @@ -52,12 +52,12 @@ public String getName() { return name; } - + public State getState() { return state; } - - public StageModel getStage() { + + public String getStage() { return stage; } @@ -65,89 +65,100 @@ public Set getAreaIdSet() { return areaMap.keySet(); } - + @JSONHint(ignore = true) public Area getArea(String areaId) { return areaMap.get(areaId); } - + @JSONHint(ignore = true) public Set getObjIdSet() { return objMap.keySet(); } - + @JSONHint(ignore = true) public Object getObject(String objId) { return objMap.get(objId); } - + @JSONHint(ignore = true) public List getCharacters() { - List characters = new ArrayList<>(); - for (Character character : characterMap.values()) { - characters.add(character); - } - return characters; + return new ArrayList(characterMap.values()); } @JSONHint(ignore = true) public Character getCharacter(String characterId) { return characterMap.get(characterId); } - + public void setName(String name) { this.name = name; } - + public void setState(State state) { this.state = state; } - - public void setStage(StageModel stage) { + + public void setStage(String stage) { this.stage = stage; } public IDAddressedEntity createArea(String name, Plain[] region, HashSet permissions) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet()); + String id = RandomStringGenerator.generateUniqueString(Area.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet()); Area area = new Area(name, region, permissions); areaMap.put(id, area); return new IDAddressedEntity(id, area); } - - public IDAddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, Attribute attribute, ObjectModel model) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); + + public IDAddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, + Angle angle, Attribute attribute, String model) { + String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); Object object = new Object(position, velocity, angularVelocity, angle, attribute, model); objMap.put(id, object); return new IDAddressedEntity(id, object); } - public IDAddressedEntity createCharacter(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet()); - Character character = new Character(accountURI, name, position, angle, model); + /** + * InstancesRest�Ƃ̃G���[�����p (��ŏ���) + */ + public IDAddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, + Angle angle, Attribute attribute, ObjectModel model) { + String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); + Object object = new Object(position, velocity, angularVelocity, angle, attribute, ""); + objMap.put(id, object); + return new IDAddressedEntity(id, object); + } + + public IDAddressedEntity createCharacter(String instanceId, String accountURI, String name, Position3D position, + Angle angle, String model) { + String id = RandomStringGenerator.generateUniqueString(Character.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet()); + Character character = new Character(instanceId, accountURI, name, position, angle, model); characterMap.put(id, character); return new IDAddressedEntity(id, character); } - public Character updateCharacter(String characterId, Position3D position, Angle angle, CharacterModel model) { + public Character updateCharacter(String characterId, Position3D position, Angle angle, String model) { Character character = characterMap.get(characterId); - character.setPosition(position); - character.setAngle(angle); - character.setModel(model); + character.update(position, angle, model, null); // areaURI(��4����)�̍X�V�͌Ăяo����Ŏ����ōs���� return character; } - + public Character destroyCharacter(String characterId) { return characterMap.remove(characterId); } - + public Area destroyArea(String areaId) { return areaMap.remove(areaId); } - + public Object destroyObject(String objId) { return objMap.remove(objId); } - + public static enum State { AVAILABLE, MAINTENANCE; } diff --git a/src/main/java/cactusServer/entities/Item.java b/src/main/java/cactusServer/entities/Item.java index 88533bb..0055397 100644 --- a/src/main/java/cactusServer/entities/Item.java +++ b/src/main/java/cactusServer/entities/Item.java @@ -1,8 +1,11 @@ package cactusServer.entities; +import net.arnx.jsonic.JSONHint; + public class Item extends Entity{ private String name; private int amount; + @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Item() { // JSONDecode���̌Ăяo���p diff --git a/src/main/java/cactusServer/entities/Object.java b/src/main/java/cactusServer/entities/Object.java index 19f55f1..d73a8f9 100644 --- a/src/main/java/cactusServer/entities/Object.java +++ b/src/main/java/cactusServer/entities/Object.java @@ -1,24 +1,25 @@ package cactusServer.entities; -import java.util.HashMap; - import framework.model3D.Position3D; import framework.physics.AngularVelocity3D; import framework.physics.Velocity3D; +import net.arnx.jsonic.JSONHint; -public class Object extends Entity{ +public class Object extends Entity { private Position3D position; private Velocity3D velocity; private AngularVelocity3D angularVelocity; private Angle angle; private Attribute attribute; - private ObjectModel model; + private String model; + @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Object() { // JSONDecode���̌Ăяo���p } - - public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, Attribute attribute, ObjectModel model) { + + public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, + Attribute attribute, String model) { setPosition(position); setVelocity(velocity); setAngularVelocity(angularVelocity); @@ -26,19 +27,19 @@ setAttribute(attribute); setModel(model); } - + public Position3D getPosition() { return position; } - + public Velocity3D getVelocity() { return velocity; } - + public AngularVelocity3D getAngularVelocity() { return angularVelocity; } - + public Angle getAngle() { return angle; } @@ -47,22 +48,22 @@ return attribute; } - public ObjectModel getModel() { + public String getModel() { return model; } - + public void setPosition(Position3D position) { this.position = position; } - + public void setVelocity(Velocity3D velocity) { this.velocity = velocity; } - + public void setAngularVelocity(AngularVelocity3D angularVelocity) { this.angularVelocity = angularVelocity; } - + public void setAngle(Angle angle) { this.angle = angle; } @@ -71,27 +72,27 @@ this.attribute = attribute; } - public void setModel(ObjectModel model) { + public void setModel(String model) { this.model = model; } - + public static class Attribute { private boolean moveable; // �“� private double cof; // ���C�W�� - + public Attribute(boolean moveable, double cof) { setMoveable(moveable); setCof(cof); } - + public boolean isMoveable() { return moveable; } - + public double getCof() { return cof; } - + public void setMoveable(boolean moveable) { this.moveable = moveable; } diff --git a/src/main/java/cactusServer/entities/Plain.java b/src/main/java/cactusServer/entities/Plain.java index fbe7603..cdbad6c 100644 --- a/src/main/java/cactusServer/entities/Plain.java +++ b/src/main/java/cactusServer/entities/Plain.java @@ -1,7 +1,5 @@ package cactusServer.entities; -import java.util.List; - public class Plain { private double a; // ���ʂ̕����� ax+by+cz+d ��a private double b; // ���ʂ̕����� ax+by+cz+d ��b @@ -11,30 +9,30 @@ private Plain() { // JSONDecode���̌Ăяo���p } - + public Plain(double a, double b, double c, double d) { setA(a); setB(b); setC(c); setD(d); } - + public double getA() { return a; } - + public double getB() { return b; } - + public double getC() { return c; } - + public double getD() { return d; } - + public void setA(double a) { this.a = a; } diff --git a/src/main/java/cactusServer/entities/Player.java b/src/main/java/cactusServer/entities/Player.java index f2c59d4..4d1ce8e 100644 --- a/src/main/java/cactusServer/entities/Player.java +++ b/src/main/java/cactusServer/entities/Player.java @@ -2,8 +2,9 @@ import cactusServer.models.Instances; import framework.model3D.Position3D; +import net.arnx.jsonic.JSONHint; -public class Player extends Entity{ +public class Player extends Entity { private String instanceURI; private String characterURI; private String areaURI; @@ -11,22 +12,41 @@ private Angle angle; private CameraState cameraState; private EmoteState emoteState; + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; private Player() { // JSONDecode���̌Ăяo���p } - - public Player(String instanceURI, String characterURI, CameraState cameraState, EmoteState.EmoteType animationClassToStart) { + + public Player(String instanceURI, String characterURI, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { setInstanceURI(instanceURI); setCharacterURI(characterURI); setCameraState(cameraState); - setEmoteState(new EmoteState(animationClassToStart)); + setAnimationClassToStart(animationClassToStart); + readCharacterData(characterURI); + } + + private Character getCharacter(String characterURI) { + String[] characterURISplit = characterURI.split("/"); // �c�c/instances/{instanceId}/characters/{characterId} + int splitSize = characterURISplit.length; + String characterId = characterURISplit[splitSize - 1]; + String instanceId = characterURISplit[splitSize - 3]; + return Instances.getInstance().getInstance(instanceId).getCharacter(characterId); + } + + private void readCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + setPosition(character.getPosition()); + setAngle(character.getAngle()); + setAreaURI(character.getAreaURI()); } public String getInstanceURI() { return instanceURI; } - + public String getCharacterURI() { return characterURI; } @@ -38,7 +58,7 @@ public Position3D getPosition() { return position; } - + public Angle getAngle() { return angle; } @@ -50,7 +70,7 @@ public EmoteState getEmoteState() { return emoteState; } - + public void setInstanceURI(String instanceURI) { this.instanceURI = instanceURI; } @@ -59,6 +79,10 @@ this.characterURI = characterURI; } + public void setAreaURI(String areaURI) { + this.areaURI = areaURI; + } + public void setPosition(Position3D position) { this.position = position; } @@ -70,16 +94,62 @@ public void setCameraState(CameraState cameraState) { this.cameraState = cameraState; } - + public void setEmoteState(EmoteState emoteState) { this.emoteState = emoteState; } - - public void setanimationClassToStart(EmoteState.EmoteType animationClassToStart) { + + public void setAnimationClassToStart(EmoteState.EmoteType animationClassToStart) { setEmoteState(new EmoteState(animationClassToStart)); } - - public void updateEmoteType(EmoteState.EmoteType animationClassToStart) { + + public Player update(String characterURI, Position3D position, Angle angle, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + setCharacterURI(characterURI); + setPosition(position); + setAngle(angle); + setCameraState(cameraState); + updateEmoteType(animationClassToStart); + updateAreaURI(); + return this; + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // �c�c/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + setAreaURI(findAreaURI(instance)); + } + } + + private String findAreaURI(Instance instance) { + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + for (String areaId : instance.getAreaIdSet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; + StringBuilder newAreaURI = new StringBuilder(); + return newAreaURI.append(areaURI.substring(0, subStringEndIndex)).append(areaId).toString(); + } + } + return ""; + } + + private void updateEmoteType(EmoteState.EmoteType animationClassToStart) { this.emoteState.setEmoteType(animationClassToStart); } + + public void destroyPlayer() { + writeCharacterData(characterURI); + } + + private void writeCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + character.update(position, angle, null, areaURI); // model(��3����)�̍X�V�͏o���Ȃ� + } } diff --git a/src/main/java/cactusServer/entities/Session.java b/src/main/java/cactusServer/entities/Session.java deleted file mode 100644 index 5e4b171..0000000 --- a/src/main/java/cactusServer/entities/Session.java +++ /dev/null @@ -1,27 +0,0 @@ -package cactusServer.entities; - -import java.net.URI; - -import cactusServer.entities.Account; - -public class Session extends URIAddressedEntity{ - public Session(Account account, URI accountURI) { - super(accountURI, account); - } - - public Account getAccount() { - return (Account)getBody(); - } - - public void setAccount(Account account) { - setBody(account); - } - - public URI getAccountURI() { - return getUri(); - } - - public void setAccountURI(URI accountURI) { - setUri(accountURI); - } -} diff --git a/src/main/java/cactusServer/entities/URIAddressedEntity.java b/src/main/java/cactusServer/entities/URIAddressedEntity.java index bd5e264..864c840 100644 --- a/src/main/java/cactusServer/entities/URIAddressedEntity.java +++ b/src/main/java/cactusServer/entities/URIAddressedEntity.java @@ -2,20 +2,21 @@ import java.net.URI; -public class URIAddressedEntity extends AddressedEntity{ +public class URIAddressedEntity{ private URI uri; + private Entity body; private URIAddressedEntity() { // JSONDecode���̌Ăяo���p } public URIAddressedEntity(URI uri, Entity body) { - super(body); + setBody(body); setUri(uri); } public URIAddressedEntity(String str, Entity body) { - super(body); + setBody(body); setUri(URI.create(str)); } @@ -26,4 +27,12 @@ public void setUri(URI uri) { this.uri = uri; } + + public Entity getBody() { + return body; + } + + public void setBody(Entity body) { + this.body = body; + } } diff --git a/src/main/java/cactusServer/models/Accounts.java b/src/main/java/cactusServer/models/Accounts.java index ee05a49..ca25106 100644 --- a/src/main/java/cactusServer/models/Accounts.java +++ b/src/main/java/cactusServer/models/Accounts.java @@ -5,16 +5,16 @@ import cactusServer.entities.*; import cactusServer.utils.RandomStringGenerator; -import java.net.URI; import java.util.*; @Singleton public class Accounts { + public static final int ACCOUNT_NUM_MAX = 10000; private static Accounts theInstance = null; - private ArrayList accounts = new ArrayList<>(10000); - private HashSet userIDSet = new HashSet<>(10000); - private HashSet uniqueIDSet = new HashSet<>(10000); - private Session session; + private ArrayList accounts = new ArrayList<>(ACCOUNT_NUM_MAX); + private HashSet userIDSet = new HashSet<>(ACCOUNT_NUM_MAX); + private HashSet uniqueIDSet = new HashSet<>(ACCOUNT_NUM_MAX); + private URIAddressedEntity session; private Accounts() { @@ -27,7 +27,7 @@ return theInstance; } - public Session createAcount(String userID, String userName, String userPass) { + public URIAddressedEntity createAcount(String userID, String userName, String userPass) { if (!userIDSet.add(userID)) return null; String uniqueID = RandomStringGenerator.generateUniqueString(12, RandomStringGenerator.ALPHA_NUMERIC, @@ -35,7 +35,7 @@ uniqueIDSet.add(uniqueID); Account newAccount = new Account(userID, userName, userPass, uniqueID); accounts.add(newAccount); - session = new Session(newAccount, URI.create("/CactusServer/rest/accounts/" + uniqueID)); + session = new URIAddressedEntity("/CactusServer/rest/accounts/" + uniqueID, newAccount); return session; } @@ -84,12 +84,13 @@ return null; } - public Session loginAccount(String userID, String userPass) { - if (getAccountByID(userID).getPass().equals(userPass)) { + public URIAddressedEntity loginAccount(String userID, String userPass) { + if (getAccountByID(userID) != null && getAccountByID(userID).getPass().equals(userPass)) { Accounts.getInstance().getAccountByID(userID).setLogin(true); Accounts.getInstance().getAccountByID(userID).formToken(); - session = new Session(Accounts.getInstance().getAccountByID(userID), URI.create( - "/CactusServer/rest/accounts/" + Accounts.getInstance().getAccountByID(userID).getUniqueID())); + session = new URIAddressedEntity( + "/CactusServer/rest/accounts/" + Accounts.getInstance().getAccountByID(userID).getUniqueID(), + Accounts.getInstance().getAccountByID(userID)); return session; } else { return null; @@ -102,7 +103,10 @@ } public Account deleteAccount(String uniqueID) { - Account edit = Accounts.getInstance().getAccountToken(uniqueID); + Account edit = Accounts.getInstance().getAccountByuniqueID(uniqueID); + if (edit == null) { + return edit; + } userIDSet.remove(edit.getId()); uniqueIDSet.remove(edit.getUniqueID()); accounts.remove(edit); diff --git a/src/main/java/cactusServer/models/Instances.java b/src/main/java/cactusServer/models/Instances.java index d57dd01..4d3bc6d 100644 --- a/src/main/java/cactusServer/models/Instances.java +++ b/src/main/java/cactusServer/models/Instances.java @@ -1,22 +1,17 @@ package cactusServer.models; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.apache.commons.lang3.RandomStringUtils; - -import cactusServer.entities.AddressedEntity; +import cactusServer.entities.Angle; import cactusServer.entities.CameraState; import cactusServer.entities.EmoteState; import cactusServer.entities.IDAddressedEntity; import cactusServer.entities.Instance; import cactusServer.entities.Player; -import cactusServer.entities.StageModel; import cactusServer.utils.RandomStringGenerator; -import net.arnx.jsonic.JSONHint; +import framework.model3D.Position3D; /** * �C���X�^���X���Ǘ�����N���X @@ -28,8 +23,7 @@ private static Instances theInstance = null; private HashMap instanceMap = new HashMap<>(); // instance��ID�Ǝ��̂��Ǘ� private HashMap playerMap = new HashMap<>(); - private static final int UNIQUE_ID_LENGTH = 12; - + private Instances() { } @@ -45,23 +39,27 @@ } return theInstance; } - + /** * �V����Instance�N���X���쐬����Map�ɒlj����� + * * @param name * @param state * @param stageModel * @return */ - public IDAddressedEntity createInstance(String name, Instance.State state, StageModel stageModel) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, instanceMap.keySet()); + public IDAddressedEntity createInstance(String name, Instance.State state, String stageModel) { + String id = RandomStringGenerator.generateUniqueString(Instance.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, instanceMap.keySet()); Instance instance = new Instance(name, state, stageModel); instanceMap.put(id, instance); return new IDAddressedEntity(id, instance); } - - public IDAddressedEntity createPlayer(String instanceURI, String characterURI, CameraState cameraState, EmoteState.EmoteType animationClassToStart) { - String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, playerMap.keySet()); + + public IDAddressedEntity createPlayer(String instanceURI, String characterURI, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + String id = RandomStringGenerator.generateUniqueString(Player.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, playerMap.keySet()); Player player = new Player(instanceURI, characterURI, cameraState, animationClassToStart); playerMap.put(id, player); return new IDAddressedEntity(id, player); @@ -77,19 +75,22 @@ public Instance getInstance(String instanceId) { return instanceMap.get(instanceId); } - -// public List getPlayers() { -// //playerMap.values().toArray() -//// List players = new ArrayList<>(); -//// for (Player player : playerMap.values().) { -//// //players. -//// } -// } - + + public List getPlayers() { + return new ArrayList(playerMap.values()); + } + public Player getPlayer(String playerId) { return playerMap.get(playerId); } + public Player updatePlayer(String playerId, String characterURI, Position3D position, Angle angle, + CameraState cameraState, EmoteState.EmoteType animationClassToStart) { + Player player = playerMap.get(playerId); + player.update(characterURI, position, angle, cameraState, animationClassToStart); + return player; + } + /** * ID�ɑΉ�����Instance��Map����폜���ĕԂ� * @@ -100,7 +101,7 @@ public Instance destroyInstance(String instanceId) { return instanceMap.remove(instanceId); } - + public Player destroyPlayer(String playerId) { return playerMap.remove(playerId); } diff --git a/src/main/java/cactusServer/resources/AccountsRest.java b/src/main/java/cactusServer/resources/AccountsRest.java index aa51dc9..cb3371c 100644 --- a/src/main/java/cactusServer/resources/AccountsRest.java +++ b/src/main/java/cactusServer/resources/AccountsRest.java @@ -1,6 +1,7 @@ package cactusServer.resources; -import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; + import javax.ws.rs.*; import javax.ws.rs.core.MediaType; @@ -9,12 +10,15 @@ @Path("/accounts") public class AccountsRest { - private HttpServletResponse response; - @PUT @Produces(MediaType.APPLICATION_JSON) - public Session loginAccount(@FormParam("userID") String userID, @FormParam("userPass") String userPass) { - return Accounts.getInstance().loginAccount(userID, userPass); + public URIAddressedEntity loginAccount(@FormParam("userID") String userID, @FormParam("userPass") String userPass) { + URIAddressedEntity session = Accounts.getInstance().loginAccount(userID, userPass); + if (session != null) { + return session; + } else { + throw new WebApplicationException(400); + } } @POST @@ -26,9 +30,14 @@ @POST @Produces(MediaType.APPLICATION_JSON) - public Session createAccount(@FormParam("userID") String userID, @FormParam("userName") String userName, + public URIAddressedEntity createAccount(@FormParam("userID") String userID, @FormParam("userName") String userName, @FormParam("userPass") String userPass) { - return Accounts.getInstance().createAcount(userID, userName, userPass); + URIAddressedEntity editAccount = Accounts.getInstance().createAcount(userID, userName, userPass); + if(editAccount != null) { + return editAccount; + }else { + throw new WebApplicationException(409); + } } @GET @@ -37,12 +46,22 @@ public Account getAccount(@PathParam("uniqueID") String uniqueID) { return Accounts.getInstance().getAccountByuniqueID(uniqueID); } - + @DELETE + @Path("/{uniqueID}") @Produces(MediaType.APPLICATION_JSON) - public Account deleteAccount(@FormParam("token") String token) { - return Accounts.getInstance().deleteAccount(token); + public Account deleteAccount(@PathParam("uniqueID") String uniqueID) { + if (Accounts.getInstance().getAccountByuniqueID(uniqueID) != null) { + return Accounts.getInstance().deleteAccount(uniqueID); + } else { + throw new WebApplicationException(400); + } } - + + @GET + @Produces(MediaType.APPLICATION_JSON) + public ArrayList getAccounts() { + return Accounts.getInstance().getAccounts(); + } } diff --git a/src/main/java/cactusServer/resources/InstancesRest.java b/src/main/java/cactusServer/resources/InstancesRest.java index 62c4060..e38a0f5 100644 --- a/src/main/java/cactusServer/resources/InstancesRest.java +++ b/src/main/java/cactusServer/resources/InstancesRest.java @@ -16,6 +16,8 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import org.glassfish.jersey.process.internal.RequestScoped; + import cactusServer.entities.AddressedEntity; import cactusServer.entities.Angle; import cactusServer.entities.Area; @@ -39,6 +41,7 @@ @Path("/instances") +@RequestScoped public class InstancesRest { public static final String INSTANCES_URI = "/CactusServer/rest/instances"; public InstancesRest() { @@ -106,11 +109,11 @@ @POST @Produces(MediaType.APPLICATION_JSON) - public URIAddressedEntity create(@FormParam("name") String name, @FormParam("state") Instance.State state, @FormParam("stageModel") StageModel stageModel) { + public URIAddressedEntity create(@FormParam("name") String name, @FormParam("state") Instance.State state, @FormParam("stageModel") String stageModel) { IDAddressedEntity ae = Instances.getInstance().createInstance(name, state, stageModel); return new URIAddressedEntity((INSTANCES_URI + "/" + ae.getId()), ae.getBody()); } - + @Path("/{instanceId}/areas") @POST @Produces(MediaType.APPLICATION_JSON) @@ -126,7 +129,7 @@ @Produces(MediaType.APPLICATION_JSON) public URIAddressedEntity createObject(@PathParam("instanceId") String instanceId, @FormParam("position") Position3D position, @FormParam("velocity") Velocity3D velocity, @FormParam("angularVelocity") AngularVelocity3D angularVelocity, - @FormParam("angle") Angle angle, @FormParam("attribute") Attribute attribute, @FormParam("model") ObjectModel model) { + @FormParam("angle") Angle angle, @FormParam("attribute") Attribute attribute, @FormParam("model") String model) { Instance instance = Instances.getInstance().getInstance(instanceId); IDAddressedEntity ae = instance.createObject(position, velocity, angularVelocity, angle, attribute, model); return new URIAddressedEntity((INSTANCES_URI + "/" + instanceId + "/objects/" + ae.getId()), ae.getBody()); @@ -137,9 +140,9 @@ @Produces(MediaType.APPLICATION_JSON) public URIAddressedEntity createCharacter(@PathParam("instanceId") String instanceId, @FormParam("accountURI") String accountURI, @FormParam("name") String name, @FormParam("position") Position3D position, @FormParam("angle") Angle angle, - @FormParam("model") CharacterModel model) { + @FormParam("model") String model) { Instance instance = Instances.getInstance().getInstance(instanceId); - IDAddressedEntity ae = instance.createCharacter(accountURI, name, position, angle, model); + IDAddressedEntity ae = instance.createCharacter(instanceId, accountURI, name, position, angle, model); return new URIAddressedEntity((INSTANCES_URI + "/" + instanceId + "/characters/" + ae.getId()), ae.getBody()); } @@ -153,9 +156,6 @@ return new URIAddressedEntity((INSTANCES_URI + "/" + instanceURI + "/players/" + ae.getId()), ae.getBody()); } - - - // @Path("/players/{playerId}") // @PUT // @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/cactusServer/utils/JSONConsumer.java b/src/main/java/cactusServer/utils/JSONConsumer.java index c3b4d23..c61d8a2 100644 --- a/src/main/java/cactusServer/utils/JSONConsumer.java +++ b/src/main/java/cactusServer/utils/JSONConsumer.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.lang.annotation.Annotation; import java.lang.reflect.Type; @@ -16,30 +17,30 @@ import net.arnx.jsonic.JSON; import net.arnx.jsonic.JSONException; -@Provider -@Consumes(MediaType.APPLICATION_JSON) -public class JSONConsumer implements MessageBodyReader { - - public boolean isReadable(java.lang.Class type, - java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] - annotations, MediaType mediaType) { - return true; +/** + * �����g�p���Ȃ��Ȃ�Ǝv�� + * @author student + * + */ +//@Provider +//@Consumes(MediaType.APPLICATION_JSON) +public class JSONConsumer implements MessageBodyReader { + @Override + public boolean isReadable(Class type, java.lang.reflect.Type genericType, + java.lang.annotation.Annotation[] annotations, MediaType mediaType) { + // return true; + return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE); } - @Override - public Object readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, - MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { - // TODO Auto-generated method stub + public Object readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, InputStream entityStream) + throws IOException, WebApplicationException { try { - return JSON.decode(entityStream,genericType); + // return JSON.decode(entityStream,genericType); + return JSON.decode(entityStream, type); } catch (JSONException e) { - // TODO Auto-generated catch block - return null; - } catch (IOException e) { - // TODO Auto-generated catch block return null; } } - } \ No newline at end of file diff --git a/src/main/java/cactusServer/utils/JSONProvider.java b/src/main/java/cactusServer/utils/JSONProvider.java index 09819fb..4cab69f 100644 --- a/src/main/java/cactusServer/utils/JSONProvider.java +++ b/src/main/java/cactusServer/utils/JSONProvider.java @@ -16,23 +16,26 @@ @Provider() @Produces(MediaType.APPLICATION_JSON) -public class JSONProvider implements MessageBodyWriter { - @Override - public long getSize(Object arg0, Class arg1, Type arg2, Annotation[] arg3, MediaType arg4) { - try { - return JSON.encode(arg0).getBytes("UTF-8").length; - } catch (Exception e) { - throw new RuntimeException(e); - } - } +public class JSONProvider implements MessageBodyWriter { + @Override + public long getSize(Object obj, Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + try { + return JSON.encode(obj).getBytes("UTF-8").length; + } catch (Exception e) { + throw new RuntimeException(e); + } + } - @Override - public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2, MediaType arg3) { - return true; - } + @Override + public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + // return true; + return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE); + } - @Override - public void writeTo(Object arg0, Class arg1, Type arg2, Annotation[] arg3, MediaType arg4, MultivaluedMap arg5, OutputStream arg6) throws IOException, WebApplicationException { - JSON.encode(arg0, arg6); - } + @Override + public void writeTo(Object obj, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, OutputStream entityStream) + throws IOException, WebApplicationException { + JSON.encode(obj, entityStream); + } } \ No newline at end of file diff --git a/src/main/java/cactusServer/utils/MyParamConverter.java b/src/main/java/cactusServer/utils/MyParamConverter.java new file mode 100644 index 0000000..5c353cb --- /dev/null +++ b/src/main/java/cactusServer/utils/MyParamConverter.java @@ -0,0 +1,23 @@ +package cactusServer.utils; + +import javax.ws.rs.ext.ParamConverter; + +import net.arnx.jsonic.JSON; + +public class MyParamConverter implements ParamConverter { + private Class type; + + public MyParamConverter(Class type) { + this.type = type; + } + + @Override + public Object fromString(String value) { + return JSON.decode(value, type); + } + + @Override + public String toString(Object obj) { + return JSON.encode(obj); + } +} diff --git a/src/main/java/cactusServer/utils/MyParamConverterProvider.java b/src/main/java/cactusServer/utils/MyParamConverterProvider.java new file mode 100644 index 0000000..61ed672 --- /dev/null +++ b/src/main/java/cactusServer/utils/MyParamConverterProvider.java @@ -0,0 +1,26 @@ +package cactusServer.utils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.ext.ParamConverter; +import javax.ws.rs.ext.ParamConverterProvider; +import javax.ws.rs.ext.Provider; + +/** + * Rest�n�N���X�̃��\�b�h�ɂ�����,�@FormParam�A�m�e�[�V�������‚����������̌^��FormParam�̐��������
+ * �������Ă��Ȃ��ꍇ��, ���Y�����𖞂������������S���N���X + * @author r-isitani + * + */ +@Provider +public class MyParamConverterProvider implements ParamConverterProvider { + @Override + @SuppressWarnings("unchecked") + public ParamConverter getConverter(Class rawType, Type genericType, Annotation[] annotations) { + if (rawType != null && !rawType.equals(String.class)) { + return (ParamConverter) new MyParamConverter(rawType); + } + return null; + } +}