private static boolean checkDependants( final IdeaPluginDescriptor pluginDescriptor, final Function<PluginId, IdeaPluginDescriptor> pluginId2Descriptor, final Condition<PluginId> check, final Set<PluginId> processed) { processed.add(pluginDescriptor.getPluginId()); final PluginId[] dependentPluginIds = pluginDescriptor.getDependentPluginIds(); final Set<PluginId> optionalDependencies = new HashSet<PluginId>(Arrays.asList(pluginDescriptor.getOptionalDependentPluginIds())); for (final PluginId dependentPluginId : dependentPluginIds) { if (processed.contains(dependentPluginId)) continue; // TODO[yole] should this condition be a parameter? if (isModuleDependency(dependentPluginId) && (ourAvailableModules.isEmpty() || ourAvailableModules.contains(dependentPluginId.getIdString()))) { continue; } if (!optionalDependencies.contains(dependentPluginId)) { if (!check.value(dependentPluginId)) { return false; } final IdeaPluginDescriptor dependantPluginDescriptor = pluginId2Descriptor.fun(dependentPluginId); if (dependantPluginDescriptor != null && !checkDependants(dependantPluginDescriptor, pluginId2Descriptor, check, processed)) { return false; } } } return true; }
/** * type check this rule * * @throws TypeException if the ruele contains type errors */ public void typeCheck() throws TypeException { String helperName = ruleScript.getTargetHelper(); // ensure that we have a valid helper class if (helperName != null) { try { helperClass = loader.loadClass(helperName); } catch (ClassNotFoundException e) { throw new TypeException( "Rule.typecheck : unknown helper class " + helperName + " for rule " + getName()); } } else { helperClass = Helper.class; } if (triggerExceptions != null) { // ensure that the type group includes the exception types typeGroup.addExceptionTypes(triggerExceptions); } // try to resolve all types in the type group to classes typeGroup.resolveTypes(); // use the descriptor to derive the method argument types and type any bindings for them // that are located in the bindings list installParameters((triggerAccess & Opcodes.ACC_STATIC) != 0, triggerClass); event.typeCheck(Type.VOID); condition.typeCheck(Type.Z); action.typeCheck(Type.VOID); }
private Rule(RuleScript ruleScript, ClassLoader loader, HelperManager helperManager) throws ParseException, TypeException, CompileException { ParseNode ruleTree; this.ruleScript = ruleScript; this.helperClass = null; this.loader = loader; typeGroup = new TypeGroup(loader); bindings = new Bindings(); checked = false; triggerClass = null; triggerMethod = null; triggerDescriptor = null; triggerAccess = 0; returnType = null; accessibleFields = null; accessibleMethods = null; // this is only set when the rule is created via a real installed transformer this.helperManager = helperManager; ECAGrammarParser parser = null; try { String file = getFile(); ECATokenLexer lexer = new ECATokenLexer(new StringReader(ruleScript.getRuleText())); lexer.setStartLine(getLine()); lexer.setFile(file); parser = new ECAGrammarParser(lexer); parser.setFile(file); Symbol parse = (debugParse ? parser.debug_parse() : parser.parse()); if (parser.getErrorCount() != 0) { String message = "rule " + ruleScript.getName(); message += parser.getErrors(); throw new ParseException(message); } ruleTree = (ParseNode) parse.value; } catch (ParseException pe) { throw pe; } catch (Throwable th) { String message = "rule " + ruleScript.getName(); if (parser != null && parser.getErrorCount() != 0) { message += parser.getErrors(); } message += "\n" + th.getMessage(); throw new ParseException(message); } ParseNode eventTree = (ParseNode) ruleTree.getChild(0); ParseNode conditionTree = (ParseNode) ruleTree.getChild(1); ParseNode actionTree = (ParseNode) ruleTree.getChild(2); event = Event.create(this, eventTree); condition = Condition.create(this, conditionTree); action = Action.create(this, actionTree); key = null; }
/** * generate a string representation of the rule * * @return a string representation of the rule */ public String toString() { StringWriter stringWriter = new StringWriter(); stringWriter.write("RULE "); stringWriter.write(getName()); stringWriter.write("\n"); if (isInterface()) { stringWriter.write("INTERFACE "); } else { stringWriter.write("CLASS "); } if (isOverride()) { stringWriter.write("^"); } stringWriter.write(getTargetClass()); stringWriter.write('\n'); stringWriter.write("METHOD "); stringWriter.write(getTargetMethod()); stringWriter.write('\n'); stringWriter.write(getTargetLocation().toString()); stringWriter.write('\n'); if (event != null) { event.writeTo(stringWriter); } else { stringWriter.write("BIND NOTHING\n"); } if (condition != null) { condition.writeTo(stringWriter); } else { stringWriter.write("COND TRUE\n"); } if (action != null) { action.writeTo(stringWriter); } else { stringWriter.write("DO NOTHING\n"); } return stringWriter.toString(); }
public void setCondition(String conditionSpec) throws ParseException, TypeException { if (event != null & condition == null) { condition = Condition.create(this, conditionSpec); } }
private void parseMobFile(String strStore, RandomAccessFile rafFile) { try { if (strStore.equalsIgnoreCase("skill")) { strStore = rafFile.readLine(); int value = Byte.parseByte(rafFile.readLine()); addToSkill(strStore, value); engGame.log.printMessage(Log.DEBUG, strStore + "=" + value); return; } if (strStore.equalsIgnoreCase("condition")) { Condition cndStore = engGame.getCondition(rafFile.readLine()); cndStore.intTicksPast = Integer.parseInt(rafFile.readLine()); cndStore.intDuration = Integer.parseInt(rafFile.readLine()); addCondition(cndStore); engGame.log.printMessage(Log.DEBUG, "condition \"" + cndStore.strName + "\""); return; } if (strStore.equalsIgnoreCase("giveitem")) { String strItem = rafFile.readLine(); double dblChance = Double.valueOf(rafFile.readLine()).doubleValue(); vctGiveItems.addElement(new GiveItem(strItem, dblChance)); engGame.log.printMessage( Log.DEBUG, strName + " gives a \"" + strItem + "\" " + (100 * dblChance) + "% of the time."); return; } if (strStore.equalsIgnoreCase("item")) { Item itmStore = engGame.getItem(rafFile.readLine()); if (itmStore != null) { itmStore.lngDurability = Long.parseLong(rafFile.readLine()); itmStore.intUses = Integer.parseInt(rafFile.readLine()); vctItems.addElement(itmStore); } return; } if (strStore.equalsIgnoreCase("clan")) { strClan = rafFile.readLine(); return; } if (strStore.equalsIgnoreCase("race")) { strRace = rafFile.readLine(); return; } if (strStore.equalsIgnoreCase("title")) { strTitle = rafFile.readLine(); return; } if (strStore.equalsIgnoreCase("description")) { strDescription = rafFile.readLine(); return; } if (strStore.equalsIgnoreCase("x")) { intLocX = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("y")) { intLocY = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("maxhp")) { maxhp = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("maxmp")) { maxmp = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("stre")) { stre = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("inte")) { inte = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("dext")) { dext = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equals("cons")) { cons = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("wisd")) { wisd = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("image")) { intImage = Integer.parseInt(rafFile.readLine()); return; } if (strStore.equalsIgnoreCase("bravery")) { dblBravery = Double.valueOf(rafFile.readLine()).doubleValue(); return; } if (strStore.equalsIgnoreCase("grouprelation")) { dblGroupRelation = Double.valueOf(rafFile.readLine()).doubleValue(); return; } if (strStore.equalsIgnoreCase("wield")) { equWorn.wield = engGame.getItem(rafFile.readLine()); if (equWorn.wield != null) { equWorn.wield.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.wield.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.wield); return; } if (strStore.equalsIgnoreCase("arms")) { equWorn.arms = engGame.getItem(rafFile.readLine()); if (equWorn.arms != null) { equWorn.arms.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.arms.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.arms); return; } if (strStore.equalsIgnoreCase("legs")) { equWorn.legs = engGame.getItem(rafFile.readLine()); if (equWorn.legs != null) { equWorn.legs.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.legs.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.legs); return; } if (strStore.equalsIgnoreCase("torso")) { equWorn.torso = engGame.getItem(rafFile.readLine()); if (equWorn.torso != null) { equWorn.torso.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.torso.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.torso); return; } if (strStore.equalsIgnoreCase("waist")) { equWorn.waist = engGame.getItem(rafFile.readLine()); if (equWorn.waist != null) { equWorn.waist.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.waist.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.waist); return; } if (strStore.equalsIgnoreCase("neck")) { equWorn.neck = engGame.getItem(rafFile.readLine()); if (equWorn.neck != null) { equWorn.neck.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.neck.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.neck); return; } if (strStore.equalsIgnoreCase("skull")) { equWorn.skull = engGame.getItem(rafFile.readLine()); if (equWorn.skull != null) { equWorn.skull.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.skull.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.skull); return; } if (strStore.equalsIgnoreCase("eyes")) { equWorn.eyes = engGame.getItem(rafFile.readLine()); if (equWorn.eyes != null) { equWorn.eyes.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.eyes.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.eyes); return; } if (strStore.equalsIgnoreCase("hands")) { equWorn.hands = engGame.getItem(rafFile.readLine()); if (equWorn.hands != null) { equWorn.hands.lngDurability = Long.parseLong(rafFile.readLine()); equWorn.hands.intUses = Integer.parseInt(rafFile.readLine()); } runWearScript(equWorn.hands); return; } if (strStore.equalsIgnoreCase("faction")) { String strFaction = rafFile.readLine(); fctFaction = engGame.getFaction(strFaction); if (fctFaction != null) { engGame.log.printMessage(Log.DEBUG, "faction=\"" + fctFaction.strName + "\""); } else { engGame.log.printMessage(Log.DEBUG, "no faction found for \"" + strFaction + "\""); } return; } if (strStore.equalsIgnoreCase("onBattle")) { strOnBattle = rafFile.readLine(); return; } if (strStore.equalsIgnoreCase("nofollow")) { noFollow = true; return; } } catch (Exception e) { engGame.log.printError( "parseMobFile():Parsing \"" + strStore + "\" from " + strName + "'s file", e); } }
/** * Asynchronous sequence update operation. Will add given amount to the sequence value. * * @param l Increment amount. * @param updateCall Cache call that will update sequence reservation count in accordance with l. * @param updated If {@code true}, will return sequence value after update, otherwise will return * sequence value prior to update. * @return Future indicating sequence value. * @throws GridException If update failed. */ private GridFuture<Long> internalUpdateAsync( long l, @Nullable Callable<Long> updateCall, boolean updated) throws GridException { checkRemoved(); A.ensure(l > 0, " Parameter mustn't be less then 1: " + l); lock.lock(); try { // If reserved range isn't exhausted. if (locVal + l <= upBound) { long curVal = locVal; locVal += l; return new GridFinishedFuture<Long>(ctx.kernalContext(), updated ? locVal : curVal); } } finally { lock.unlock(); } if (updateCall == null) updateCall = internalUpdate(l, updated); while (true) { if (updateGuard.compareAndSet(false, true)) { try { // This call must be outside lock. return ctx.closures().callLocalSafe(updateCall, true); } finally { lock.lock(); try { updateGuard.set(false); cond.signalAll(); } finally { lock.unlock(); } } } else { lock.lock(); try { while (locVal >= upBound && updateGuard.get()) { try { cond.await(500, MILLISECONDS); } catch (InterruptedException e) { throw new GridInterruptedException(e); } } checkRemoved(); // If reserved range isn't exhausted. if (locVal + l <= upBound) { long curVal = locVal; locVal += l; return new GridFinishedFuture<Long>(ctx.kernalContext(), updated ? locVal : curVal); } } finally { lock.unlock(); } } } }
/** * Synchronous sequence update operation. Will add given amount to the sequence value. * * @param l Increment amount. * @param updateCall Cache call that will update sequence reservation count in accordance with l. * @param updated If {@code true}, will return sequence value after update, otherwise will return * sequence value prior to update. * @return Sequence value. * @throws GridException If update failed. */ private long internalUpdate(long l, @Nullable Callable<Long> updateCall, boolean updated) throws GridException { checkRemoved(); assert l > 0; lock.lock(); try { // If reserved range isn't exhausted. if (locVal + l <= upBound) { long curVal = locVal; locVal += l; return updated ? locVal : curVal; } } finally { lock.unlock(); } if (updateCall == null) updateCall = internalUpdate(l, updated); while (true) { if (updateGuard.compareAndSet(false, true)) { try { // This call must be outside lock. return CU.outTx(updateCall, ctx); } finally { lock.lock(); try { updateGuard.set(false); cond.signalAll(); } finally { lock.unlock(); } } } else { lock.lock(); try { while (locVal >= upBound && updateGuard.get()) { try { cond.await(500, MILLISECONDS); } catch (InterruptedException e) { throw new GridInterruptedException(e); } } checkRemoved(); // If reserved range isn't exhausted. if (locVal + l <= upBound) { long curVal = locVal; locVal += l; return updated ? locVal : curVal; } } finally { lock.unlock(); } } } }